satotsuのいろいろつくってみた日記

いろいろつくってみたあれこれの記録。

HC-SR04で距離をはかってみる

買ったはいいものの、また積んでいた超音波センサ。動かしてみた

 

こちらを参考に。

deviceplus.jp

 

ソースはこんな感じ。

そのうち温度補正いれるかもなのと、キー入力で動作、停止をいれた。

 

#define echoPin 2 // Echo Pin

#define trigPin 3 // Trigger Pin



char op_mode   = 0;

char key_in    = 0;



double period = 0.0;

double dist   = 0.0;

double temp   = 25.0;

double spd    = 340.0;



void setup() {

  // put your setup code here, to run once:

  Serial.begin( 9600 );

  pinMode( echoPin, INPUT );

  pinMode( trigPin, OUTPUT );



  Serial.println("a: start, s: stop");

}



void loop() {

  // put your main code here, to run repeatedly:

  key_in = Serial.read();



  switch(key_in){

    case 'a':

      op_mode = 1;

      break;

      

    case 's':

      op_mode = 0;

      break;

      

    default:

      break;

  }

  

  if(op_mode){

    spd = 331.5 + 0.6 * temp;

  

    digitalWrite(trigPin, LOW); 

    delayMicroseconds(2); 

  

    digitalWrite( trigPin, HIGH ); //超音波を出力

    delayMicroseconds( 10 ); //

    digitalWrite( trigPin, LOW );

  

    period = pulseIn( echoPin, HIGH ) / 2.0;  // us

    if (period > 0) {

      dist = spd * period / 1000000; // m

      

      Serial.print("dist:	");

      Serial.print(dist);

      Serial.println("	 m");

    }

  }

  else{}

  delay(500);

}

 

できたのがこれ。ジャンパー線をぶっ刺すだけの簡単設計。

f:id:msatotsu:20180609114209j:image

 

ロボットに載せたらなんかできるかな。

Arty Z7-20 の立ち上げめも(Boot Imageの作り方)

■FSBL(First Stage Bootloader)プロジェクトの作成

Vivadoで作成したSDKを起動

File->New->Application Project
Project nameに適当な名前「xxx_FSBL」を入れてNext

Zynq FSBLを選択してFinish


デバッグオプションの設定(オプション:起動確認用UART出力)

上記作成したブートローダープロジェクト「xxx_FSBL」で右クリック -> Properties

C/C++ Build -> Settings -> ARM gcc compiler -> Symbols
FSBL_DEBUG_INFOを追加


■FSBLのコンパイル

「xxx_FSBL」で右クリック -> Build Configurations->Set Active->2. Release

「xxx_FSBL」で右クリック -> Build Project


■Boot Image(Boot.bin)の作成

アプリケーションプロジェクトを右クリック -> Create Boot Image -> Crate Image
sdk\PWM_AXI_tutorial\bootimage に BOOT.bin が作成される

■QSPIに書込み

Arty Z7の電源を入れる

SDK -> Xilinx -> Program Flash

Image File -> BOOT.bin (上記で作成したもの)
Flash Type -> qspi_single
FSBL File -> PWM_AXI_FSBL.elf (FSBLプロジェクトで作成したもの)
Program

 

(QSPI起動になってなかったら)

Arty Z7の電源を切る
JP4 -> QSPI にする
Arty Z7の電源を入れる

Arty Z7-20 の立ち上げめも(IPの作り方)

■IP(Vivado)プロジェクトの作成

Vivadoを起動(IPを使用するprj)

Tools -> Create and Package IP
Create a new AXI4 peripheral

Nameに好きなIP名を入力する

Edit IP -> Finish


■HDLの編集

(IP名)_S00_AXI.v を開いて編集する(2箇所)

// Users to add ports here
output wire [3 : 0] pwm,

// Add user logic here
assign LEDs_out = slv_reg0[3 : 0];

保存する(ctrl + s)

(IP名).v を開いて編集する(2箇所)

// Users to add ports here
output wire [3 : 0] pwm,

) pwm_v1_0_S00_AXI_inst (
.PWM(pwm),

保存する(ctrl + s)


■(必要なら)ファイルを追加する

ソースファイル
Sources -> + (Add Sources) -> Add or create design sources -> Add Files -> Finish


■IPのパッケージ化

Package IP -> File Groups -> Merge changes
Package IP -> Customization Parameters -> Merge changes
Package IP -> Ports and Interfaces で編集したポートが反映されていることを確認する
Package IP -> Reviea and Package -> Edit packageing settings


OK -> Repackage IP

arduinoで相補PWMをだしてみる(再び)

タイマについて聞かれて、前のソースみたらちょっと使いづらかったので修正。

わかりやすく、スイッチング周波数とDuty入れるようにした。

ISR (TIMER1_OVF_vect)は空っぽでも、ないと変になるので注意。

#include <avr/io.h>
#include <avr/interrupt.h>

void PWM_init(uint16_t fs, float duty) {
  TCCR1A  = 0;
  TCCR1B  = 0;
  TCNT1   = 0;
  
  // 0:in, 1:out, DDRB,DDRD: DIO, DDRC: AnalogIn
  // timer0->PD6,5, timer1->PB1,2, timer2->PB3,PD3
  DDRB    = DDRB | B00000110;

  // TCCR1A: COM1A1,COM1A0,COM1B1,COM1B0,-,-,WGM11,WGM10
  // TCCR1B: ICNC1,ICES1,-,WGM13,WGM12,CS12,CS11,CS10
  // COM1x1,COM1x0:   10: OCR1/TOP, 11:1-(OCR1/TOP)
  // WGM13,12,11,10:  1000(updown)
  // CS12,11,10: 000:stop, 001:clk, 010:clk/8, 011:clk/64,
  //             100:clk/256, 101:clk/1024
  TCCR1A  = (TCCR1A & B00001100) | bit(COM1A1) | bit(COM1B1) | bit(COM1B0);
  TCCR1B  = (TCCR1B & B11100000) | bit(WGM13) | bit(CS10);

  // TCNT1: counter
  // TIMSK1: -,-,ICIE1,-,-,OCIE1B,OCIE1A,TOIE1
  TCNT1   = 0;
  TIMSK1  = bit(TOIE1);

  // fpwm = fclk(16MHz)/(2(updown)*N*TOP), TOPmax=2^16
  // N*TOP = 16MHz/(2*1kHz)=8000, N=1, TOP=8000
  ICR1    = 8000 / fs;
  OCR1A   = ICR1 * duty;
  OCR1B   = OCR1A + 8; // deadtime 0.5us -> 0.5us*16MHz=8
}

// TIMER1_COMPB_vect, TIMER1_COMPA_vect, TIMER1_OVF_vect
ISR (TIMER1_OVF_vect) {
  
}

void setup() {
  // put your setup code here, to run once:
  noInterrupts();  
  PWM_init(10, 0.8);
  interrupts();
}

void loop() {
  // put your main code here, to run repeatedly:
}

 

波形はこんな感じ。デッドタイムの500nsもちゃんと入ってる。

f:id:msatotsu:20180519082809p:plain

タミヤのカムプログラムロボット

前に欲しくって買えなかった、カムプログラムロボットが再販されてると聞いて。

 

確かに売ってた。ヨドバシドットコムにもあった。早速買った。

 

どーん。

f:id:msatotsu:20180517224402j:image

 

開けたらこんな感じ。

f:id:msatotsu:20180517224441j:image

 

ここでプラモだったことに気づいて、1日寝かす。(SSDの換装で疲れてた。。)

 

よし、作ろう。

f:id:msatotsu:20180517224556j:image

 

あのロボット系列なので、ギアボックスがでてくる。ちょっと面倒だけどがんばる。

f:id:msatotsu:20180517224650j:image

 

なんとなく形になってきた。モータは2つ。

f:id:msatotsu:20180517224823j:image

 

できたー。顔ついてる。かわいい。

アームもうごくよ。

f:id:msatotsu:20180517224903j:image

 

ここで作るときの注意点。(つまりミスったとこ。)

 

4.ギヤケース組み立て

ブッシュは長だよ。短い方は使わないよ。よく見てね。

 

6.ステアリングレッグの組み立て

ワッシャーは2mmだよ。3mmの方を使っちゃうとあとで泣くよ。

あとブーツ。Bなら使わずに作るよ。うっかりつけるとうまく動かなくなるよ。

 

最後のページのパーツリスト。

使わない部品が書いてあるから、途中気になったら見たほうがいい。

 

おまけ(別売りのリモコンつけてみた)

f:id:msatotsu:20180519101014j:image

 

さて、arduino載せないと。

 

HP Pavilion 15-p256TX のHDDをSSDに換装する

2015年2月に家族用に買ったHPのノートPC。

水色でCore i7(5500U)が入っててかっこいい。

 

f:id:msatotsu:20180516194318j:image

 

ただ如何せん遅い。

買ったときはそこそこ速かった気がするけど、Windows10入れたせいか、いろいろアプリいれたからか徐々に我慢できないくらい遅く。

 

タスクマネージャみると、大体ディスクアクセスが100%になってる。

ウイルス対策ソフト切っても、WindowsUpdate切ってもだめ。

 

ベンチはこんな感じ。1MB/s切ってるし。ひどい。

f:id:msatotsu:20180516193543p:plain

 

なので、もうSSDに替えてみた。gramもSSDでめっちゃ速いし。

買ったのはcrucialのMX500 CT500MX500SSD1/JP。だいぶ定番っぽい。

 

f:id:msatotsu:20180516194509j:image

 

事前にcrucialのwebからツールをダウンロードして、HDDからSSDにクローンしておく。

Acronis True Imageっていうやつ。

SSDは別途買っておいたUSBケースに入れてつなぐ。

 

実はこのクローン2回失敗した。リカバリー領域がクローンできなかった。

起動領域はクローンできてるっぽかったので、もう強行した。結果は今のところ問題ない。

 

では、早速分解していく。

まず見えるネジを全部外す。

長丸シールの下と、長四角ゴム足の下を忘れないように。

ネジを外すと、DVDドライブは引っ張るだけで抜ける。

f:id:msatotsu:20180516194551j:image

 

キーボードの下らへんからパキパキとフタを開けていく。

f:id:msatotsu:20180516194723j:image

 

開くとこんな感じ。

フレキがつながってるので注意。干渉しそうなのはこの時に外しておく。

ツメを起こすだけなので簡単。

f:id:msatotsu:20180516194820j:image

 

買ってきたcrucialのMX500と入れ替える。

f:id:msatotsu:20180516194921j:image

 

フタをしてネジを止めたら完成。

 

そしてこれが換装後のベンチ結果だ!

f:id:msatotsu:20180516193744p:plain

 

速っ!!

もうこれは別物みたい。起動もシャットダウンも何もかも速い。

これでストレスなく作業できる。SSD偉大だねー。

windows10でSplatoon2のドット打ち環境を構築する

 

前にmacでやったけど、gram買ったのでwindowsでも同じような環境を入れたい。

geek-satotsu.hatenablog.jp

 

ここを参考に、arduinoを元の状態に戻していく。

qiita.com

 

突然だけどWSLのubuntuでデバイス認識できなかった(後述)ので、windowsでやることにする。

まずここにあるwindows用のdfu-programmerをダウンロードする。

https://sourceforge.net/projects/dfu-programmer/?source=typ_redirect

 

atmega16u2のファームウェアを拾ってくる。

https://roboticsclub.org/redmine/projects/quadrotor/repository/revisions/master/raw/arduino-1.0/hardware/arduino/firmwares/arduino-usbserial/Arduino-usbserial-atmega16u2-Uno-Rev3.hex

 

arduinoにジャンパーを刺してから、USBをPCにつなぐ。

ジャンパーを抜く。USB近くの赤いジャンパーのとこね。

f:id:msatotsu:20180515205036j:image

 

windowsで不明なデバイスとして認識されるので、さっきダウンロードしたdfu-programmerに入ってるATmega16U2のドライバ(atmel_usb_dfu.inf)を入れる。

 

cmd.exeで、ファームを書き込む。

dfu-programmer.exe atmega16u2 erase

dfu-programmer.exe atmega16u2 flash Arduino-usbserial-atmega16u2-Uno-Rev3.hex --force

 

うまく書けたら、USBを抜き差しする。COMポートで認識される。

これで元に戻った。 

 

以下、ubuntuでやったけどデバイスが認識しなかった。一応めも。

たぶんWSLだとusbが認識しないんだと思う。

---------------------------------------------------------------------------------------------------

ubuntuはストアから入れたので省略。ものすごく簡単。

 

ubuntuを起動したら、まずはapt-getを最新にする。

updateは早いけど、upgradeはだいぶ時間かかるので、ぼーっと待つ。

apt-get update

apt-get dist-upgrade

 

まずはdfu-programmerを入れる。

sudo apt-get install dfu-programmer

 

ファームを書き込む。ここでデバイスが認識されていなくて詰む。lsusbでも何もいない。

sudo dfu-programmer atmega16u2 erase

sudo dfu-programmer atmega16u2 flash Arduino-usbserial-atmega16u2-Uno-Rev3.hex

sudo dfu-programmer atmega16u2 reset

 

うまくいけばあとは前と同じだけど、環境汚したくないので、以下WSLでやろうと思う。

qiita.com