前回の記事組み込み初心者がキッチンタイマーをArduinoで作ってみたのあとに製作したのがライントレースカーになります。
完成品がこちら
デモ動画 pic.twitter.com/OCAapufFCi
— バキオ (@Bakio202076) August 23, 2021
黒い線をトレースしてくれてます。
開発環境
Windows
マイコン:ATmega328P
センサー:AE-NJL5901AR-8CH(秋月電子)
モータードライバー:AE-DRV8835-S(秋月電子)
本体:FT-DC-002(秋月電子)
ArduinoIDE(C言語)
基盤はオリジナル品です
ハードウェア面
4人班で2台作るという課題だったので、私ははんだ付けをやらないで本体のキットを組み立ててました。
何回もテスト走行した後の写真なのではんだがもげかけてます
セレクトスイッチで電源ONOFF。
タクトスイッチでスタートストップです。
LEDは電源がONの状態で光るようになってます。
プログラム
https://github.com/Wataru199410/portfolio_car/tree/main/carproject
前回のキッチンタイマー製作と違い今回は結構放置プレーで
センサーとモーターの仕組みを解説、あとはほぼ個人で製作
といった感じでなかなかやりがいがありました。
センサーのセットアップ部分を他の班員に作ってもらい、私はモーター部分のセットアップを製作しました。
ループ内の部分は自作です。
まずセンサーが黒に反応したらPINBのレジスタに1を返すように設定してます。
例えば一番右のセンサーが黒を感知すると
PINB
00000000
↓
00000001
このように変化します。
一番左のセンサーが反応したら
PINB
00000000
↓
10000000
こうなります。
このセンサーの変化を10進数で見て、それによりモーターの出力を左右で変えて曲がったりバックしたりさせています。
//右旋回
if(PINB >= 24 && PINB <= 31){
OCR0A = 255;
OCR0B = 0;
}
//左旋回
if(PINB >= 48 && PINB <= 240){
OCR0A = 0;
OCR0B = 255;
}
モータの出力を変えるのはATmega328pに搭載されてるタイマー0のPWM出力を使っています。
タイマー0が比較レジスタと一致するとLOWに設定しているので、比較レジスタの値を高くすると出力が上がり低くすると下がるようにしています。
OCR0Aは左のモーターの出力を決め、OCR0Bは右モーターの出力です。
大きく旋回させるためにdelay関数を使いたかったのですが、モーターの出力を調整するのにタイマー0を使っているので、授業で作った自作のdelay関数を使ってます。
#define COUNT 230UL
void delayMs(unsigned int ms){
volatile unsigned long cnt;
for(cnt =0;cnt<(COUNT * ms); cnt++);
}
改善点
クラスの他の人がタイマー1と2を使い割り込み処理をしてタイムを縮めていたのでなるほどなあと思いました。後退の動作を割り込み処理に入れればもっとスムーズに動かせそうな気がします。
おわりに
前回のキッチンタイマーの時より
このレジスタを比較対象にしたいならこう書いて~
ここで動きが変になるならこのあたりのプログラムを変えて~
といったことがスムーズにできるようになったので若干成長を感じることが出来ました。