ライントレースカー ソフト編 その2
Micro Pythonを使ったプログラミング
マイコンにRaspberry pi Picoを使い、Micro Python言語を使う場合の作成例です。
Thonnyのインストール方法は、過去記事「Thonny IDEを使ってラズピコをプログラミング」を参考にして下さい。

注意点
①18行目からのIN1.duty_u16(256*75)のPWM値は0~65535を入力しますが、桁数が多いのでArduinoの
8ビットPWM値に合わせ、直感的に解り易くするために16ビットを半分に分けて256*xxxと記しています。
②42行目からの valueL = round(sensorL.read_u16()/256)IRセンサー読取り値をround関数でまとめ、更に
256で割り、見かけ上のしきい値をArduinoの場合と同様にしました。
皆様の参考になれば幸いです。
by Paradise
マイコンにRaspberry pi Picoを使い、Micro Python言語を使う場合の作成例です。
Thonnyのインストール方法は、過去記事「Thonny IDEを使ってラズピコをプログラミング」を参考にして下さい。

注意点
①18行目からのIN1.duty_u16(256*75)のPWM値は0~65535を入力しますが、桁数が多いのでArduinoの
8ビットPWM値に合わせ、直感的に解り易くするために16ビットを半分に分けて256*xxxと記しています。
②42行目からの valueL = round(sensorL.read_u16()/256)IRセンサー読取り値をround関数でまとめ、更に
256で割り、見かけ上のしきい値をArduinoの場合と同様にしました。
- from machine import ADC, Pin ,PWM
- import utime
-
- sensorL = machine.ADC(26) # Left GPIO 26
- sensorC = machine.ADC(27) # Center GPIO 27
- sensorR = machine.ADC(28) # right GPIO 28
- IN1 = PWM(Pin(6)) # GPIO 6
- IN1.freq(1000)
- IN2 = PWM(Pin(7)) # GPIO 7
- IN2.freq(1000)
- IN3 = PWM(Pin(8)) # GPIO 8
- IN3.freq(1000)
- IN4 = PWM(Pin(9)) # GPIO 9
- IN4.freq(1000)
- def forward(): # 前進
- IN1.duty_u16(256*75)
- IN2.duty_u16(0)
- IN3.duty_u16(0)
- IN4.duty_u16(256*75)
- def turnleft(): # 左旋回
- IN1.duty_u16(0)
- IN2.duty_u16(256*60)
- IN3.duty_u16(0)
- IN4.duty_u16(256*110)
- def turnright(): # 右旋回
- IN1.duty_u16(256*110)
- IN2.duty_u16(0)
- IN3.duty_u16(256*60)
- IN4.duty_u16(0)
- def stop(): # 停止
- IN1.duty_u16(0)
- IN2.duty_u16(0)
- IN3.duty_u16(0)
- IN4.duty_u16(0)
-
- while True:
- valueL = round(sensorL.read_u16()/256) # 左IRセンサー
- valueC = round(sensorC.read_u16()/256) # 中央IRセンサー
- valueR = round(sensorR.read_u16()/256) # 右IRセンサー
- utime.sleep(0.05)
- #print("L",valueL)
- #print("C",valueC)
- #print("R",valueR)
-
- if valueL <= 100: # しきい値 100以下は白(16ビットでは25600)
- sensL = 0 # 白
- else:
- sensL = 1 # 黒
- #print("L",sensL)
-
- if valueC <= 100: # しきい値 10以下は白0(16ビットでは25600)
- sensC = 0 # 白
- else:
- sensC = 1 # 黒
- #print("C",sensC)
-
- if valueR <= 100: # しきい値 100以下は白(16ビットでは25600)
- sensR = 0 # 白
- else:
- sensR = 1 # 黒
- #print("R",sensR)
-
- if sensL==0 and sensC==1 and sensR==0: # 前進
- forward()
- if sensL==1 and sensC==1 and sensR==1: # 前進
- forward()
- elif sensL==1 and sensC==1 and sensR==0: # 左旋回
- turnleft()
- elif sensL==0 and sensC==1 and sensR==1: # 右旋回
- turnright()
- elif sensL==0 and sensC==0 and sensR==0: # 停止
- stop()
皆様の参考になれば幸いです。
by Paradise
スポンサーサイト
ライントレースカー ソフト編 その1
Raspberry pi PicoをArduino IDEを使ってプログラミング
マイコンにRaspberry pi PicoとArduino Pro Microを使った2車体を作りましたが、どちらもArduino IDEを使って
プログラミングしました。何れの車体にも赤外線距離センサーを付けましたが、通常ライントレースカーは
2台同時に走らせることが無いのでその部分は省略しています。 前回までの製作編と併せてご覧下さい。

Raspberry pi Picoのプログラミング例
Raspberry pi PicoをArduino IDEで使うには、ボードマネージャにRaspberry pi RP2040 Boards又は
Arduino Mbed OS RP2040 Boardsが、インストールされている必要があります。
Arduino Pro Microを使う場合はIOピン番号と名称が変わるだけで基本は同じです。
注意点
①21行目からのPWM信号は0~255の数値を入力しますが、大き過ぎるとスピードが出過ぎてカーブを
曲がり切れません。使用するギアモーターに合わせてカットアンドトライで決めます。
②54行目からはラインセンサーの読み取り値からコースの下地の白色とラインの黒色を識別する部分です。
しきい値は、使用するセンサーの種類、回路定数、取り付け方法、対物距離などによって出力値が変わるので
カットアンドトライで決めます。
次回はMicro Pythonを使ったプログラミング例を紹介します。
皆様の参考になれば幸いです。
by Paradise
マイコンにRaspberry pi PicoとArduino Pro Microを使った2車体を作りましたが、どちらもArduino IDEを使って
プログラミングしました。何れの車体にも赤外線距離センサーを付けましたが、通常ライントレースカーは
2台同時に走らせることが無いのでその部分は省略しています。 前回までの製作編と併せてご覧下さい。

Raspberry pi Picoのプログラミング例
Raspberry pi PicoをArduino IDEで使うには、ボードマネージャにRaspberry pi RP2040 Boards又は
Arduino Mbed OS RP2040 Boardsが、インストールされている必要があります。
Arduino Pro Microを使う場合はIOピン番号と名称が変わるだけで基本は同じです。
注意点
①21行目からのPWM信号は0~255の数値を入力しますが、大き過ぎるとスピードが出過ぎてカーブを
曲がり切れません。使用するギアモーターに合わせてカットアンドトライで決めます。
②54行目からはラインセンサーの読み取り値からコースの下地の白色とラインの黒色を識別する部分です。
しきい値は、使用するセンサーの種類、回路定数、取り付け方法、対物距離などによって出力値が変わるので
カットアンドトライで決めます。
- #define IN1 6 // GPIO 6
- #define IN2 7 // GPI0 7
- #define IN3 8 // GPIO 8
- #define IN4 9 // GPIO 9
- int Left_val;
- int Center_val;
- int Right_val;
- int L_SENS;
- int C_SENS;
- int R_SENS;
- void setup() {
- Serial.begin(115200);
- pinMode(IN1, OUTPUT); analogWrite(IN1 , 0);
- pinMode(IN2, OUTPUT); analogWrite(IN2 , 0);
- pinMode(IN3, OUTPUT); analogWrite(IN3 , 0);
- pinMode(IN4, OUTPUT); analogWrite(IN4 , 0);
- }
- void Forward() { //前進
- analogWrite(IN1, 75); // PWM 0〜255
- analogWrite(IN2, 0); // PWM 0
- analogWrite(IN3, 0); // PWM 0
- analogWrite(IN4, 75); // PWM 0〜255
- }
- void Turnleft() { //左旋回
- analogWrite(IN1, 0); // PWM 0
- analogWrite(IN2, 60); // PWM 0〜255
- analogWrite(IN3, 0); // PWM 0
- analogWrite(IN4, 110); // PWM 0〜255
- }
- void Turnright() { //右旋回
- analogWrite(IN1, 110); // PWM 0〜255
- analogWrite(IN2, 0); // PWM 0
- analogWrite(IN3, 60); // PWM 0〜255
- analogWrite(IN4, 0); // PWM 0
- }
- void Stop() { //停止
- analogWrite(IN1, 0); // PWM 0
- analogWrite(IN2, 0); // PWM 0
- analogWrite(IN3, 0); // PWM 0
- analogWrite(IN4, 0); // PWM 0
- }
- void loop() {
- Left_val = analogRead(26); // 左センサーの出力値 0〜255
- Center_val = analogRead(27); // 中央センサーの出力値 0〜255
- Right_val = analogRead(28); // 右センサーの出力値 0〜255
- if (Left_val <= 100) { // しきい値 100以下は白
- L_SENS = 0; // 白色
- }
- else {
- L_SENS = 1; // 黒色
- }
- if (Center_val <= 100) { // しきい値 100以下は白
- C_SENS = 0; // 白色
- }
- else {
- C_SENS = 1; // 黒色
- }
- if (Right_val <= 100) { // しきい値 100以下は白
- R_SENS = 0; // 白色
- }
- else {
- R_SENS = 1; // 黒色
- }
- if (L_SENS == 0 && C_SENS == 1 && R_SENS == 0) { // Forwar 前進
- Forward();
- }
- else if (L_SENS == 1 && C_SENS == 1 && R_SENS == 1) { // Forward 前進
- Forward();
- }
- else if (L_SENS == 1 && C_SENS == 1 && R_SENS == 0) { // Turnleft 左旋回
- Turnleft();
- }
- else if (L_SENS == 0 && C_SENS == 1 && R_SENS == 1) { // Turnright 右旋回
- Turnright();
- }
- else if (L_SENS == 0 && C_SENS == 0 && R_SENS == 0) { // Stop 停止
- Stop();
- }
- /*Serial.print(" L = ");
- Serial.print(L_SENS);
- Serial.print(" C = ");
- Serial.print(C_SENS);
- Serial.print(" R = ");
- Serial.println(R_SENS);*/
- }
次回はMicro Pythonを使ったプログラミング例を紹介します。
皆様の参考になれば幸いです。
by Paradise
ライントレースカー パート3
ライントレースカー パート2
ライントレースカーの改良と、もう1台追加して同じコースを走らせる。

先ずは動画をご覧下さい。
1)改良ポイント
前回の記事と併せてご覧下さい。
主な変更点は、単4充電池を2本増やして4.8VとしてモータードライバーMX1508をPWM制御に変更しました。
これにより、旋回時の左右ホイールへのパワー配分を細かく調整が出来、S字やクランクカーブを滑らかな走行が
可能となり、スピードを上げてもオーバーランや脱線することが無くなりました。
2)2台同時に走らせるために
1台用のコースに2台走らせようと思い、衝突防止に赤外線距離センサーを付けました。
1号車の方は、マイコンがRaspberry Pi Picoを使ってるため、アナログ入力3系統をラインセンサーで使用済みなので、
I2C入力を備えたシャープ製赤外線距離センサーGP2Y0E03を使いました。
センサーがフロント中央に1個なので上手く作動するか不安だったが、結果はOKでした。
3)2号車の製作
この機体も倒立振子ロボットの2号機に少し手を加えただけですが、マイコンに手持ちの古いArduino pro Microを
使いました。pro MicroはUSB入力が付いたArduinoの中では一番小型なので、小さく組みたい場合に有効です。
Raspberry Pi Picoを使った1号車と比べ、上面のみに全ての部品が実装出来ました。
2号機の赤外線距離センサーには、数年前に買ったままでお蔵入りしていた同じシャープ製のGP2Y0A21YKを
使いました。
このセンサーはアナログ出力専用なので、Pro Microのアナログ入力4箇所の内、ラインセンサーに使った残りの
1箇所が丁度使えます。
4)2号車の回路図
基本的には、マイコンをRaspberry Pi PicoをArduino pro Microに置き換えただけです。
配線数が少なく簡単に組み上がると思います。

次回はソフトウエアーについて記す予定です。
皆様の参考になれば幸いです。
by Paradise

先ずは動画をご覧下さい。
1)改良ポイント
前回の記事と併せてご覧下さい。
主な変更点は、単4充電池を2本増やして4.8VとしてモータードライバーMX1508をPWM制御に変更しました。
これにより、旋回時の左右ホイールへのパワー配分を細かく調整が出来、S字やクランクカーブを滑らかな走行が
可能となり、スピードを上げてもオーバーランや脱線することが無くなりました。
2)2台同時に走らせるために
1台用のコースに2台走らせようと思い、衝突防止に赤外線距離センサーを付けました。
1号車の方は、マイコンがRaspberry Pi Picoを使ってるため、アナログ入力3系統をラインセンサーで使用済みなので、
I2C入力を備えたシャープ製赤外線距離センサーGP2Y0E03を使いました。
センサーがフロント中央に1個なので上手く作動するか不安だったが、結果はOKでした。
3)2号車の製作
この機体も倒立振子ロボットの2号機に少し手を加えただけですが、マイコンに手持ちの古いArduino pro Microを
使いました。pro MicroはUSB入力が付いたArduinoの中では一番小型なので、小さく組みたい場合に有効です。
Raspberry Pi Picoを使った1号車と比べ、上面のみに全ての部品が実装出来ました。
2号機の赤外線距離センサーには、数年前に買ったままでお蔵入りしていた同じシャープ製のGP2Y0A21YKを
使いました。
このセンサーはアナログ出力専用なので、Pro Microのアナログ入力4箇所の内、ラインセンサーに使った残りの
1箇所が丁度使えます。
4)2号車の回路図
基本的には、マイコンをRaspberry Pi PicoをArduino pro Microに置き換えただけです。
配線数が少なく簡単に組み上がると思います。

次回はソフトウエアーについて記す予定です。
皆様の参考になれば幸いです。
by Paradise
初歩的なライントレースカーを作りました。
簡単なライントレースカー
昨年紹介しました「安価に作る倒立2輪ロボット その1~5」に少し手を加えてライントレースカーに模様替えしました。
先ずは動画をご覧下さい。
回路図
部品店すっが少なく簡単な回路です。使用部品も通販で買えるものばかりです。
Raspberry Pi PicoにはADC入力が3ヶ所用意されているので、左右と中央のフォトセンサーに丁度使えます。
補足:Raspberry Pi PicoのADCはMicro Pythonでは16ビット1 から 65535の分解能を得れます。ArduinoIDEで
Raspberry Pi Picoを使うためにArduino Mbed OS RP2040 Boardsをインストールした場合は、分解能が
仕様書の12ビットではなく、他のArduinoボードと同様に10ビット1~1023が出力されます。

心臓部にRaspberry Pi Picoを使う
ロボットコンテストの副賞に貰ったRaspberry Pi Picoをそろそろ何かに使わないとと思い立ち、通信機能が不要な
ライントレースカーに使うことにしました。
Raspberry Pi Picoの取り付けには、コネクターを使わずに基板を躯体にビス止めして、GPIO端子に直接配線を
行っています。USBソケットへのケーブルプラグの差し込みは、ホイールの隙間から行えます。
プログラムはArduino IDEを使って簡単にまとめましたが、Micro Pythonでも可能です。

ラインを読むセンサーにポピュラーなTCRT5000を使用
このセンサーは2017年7月に掲載の「Inverted Balancing Robot(倒立振子型ロボット)その9」で倒立ロボットの
ライントレース化に使ったセンサー基板がジャンクボックスに残ってたのを流用しました。
新たに購入される方は、オペアンプを内蔵してしきい値をVRで調整できる基板が安価に販売されています。
これを利用すると、アナログ入力(ADC)ではなくデジタル入力で使えますが、基板が3枚必要です。
後部の受けは、電池ボックスにダイソーのワイヤーハンガーを貼り付けただけの簡単な方法です。
ギアモーターとモータードライバー
モーターやモータードライバーユニットは倒立振子ロボットに組み込んだものを躯体ごと流用。
倒立振子ロボットの縦型配置を横に寝かせただけです。

電源について
電池ボックスを単4型電池4個用から2個用に取り換えて2.4Vで使うことにしました。
その理由は、4.8Vだとギアモーターの回転が速すぎてヘアピンカーブが曲がり切れません。
通常回転数を下げる方法としてPWM(パルス幅変調)を使いますが、Raspberry Pi Picoの入力電圧が2.1Vからに
対応していることと、電池を減らせば軽くなるメリットが有り電圧を下げる方法を用いました。

ライントレースのコースについて
私は10㎜厚、900×600㎜の発泡スチロールパネルに幅19㎜の電工用黒色ビニールテープを貼り付けて
コースを作りました。冬場はビニールテープが伸びにくくてカーブを描くのが難しいですが、ドライヤーで
温めながら行うと上手く行えます。

皆様の参考になれば幸いです。
by Paradise
昨年紹介しました「安価に作る倒立2輪ロボット その1~5」に少し手を加えてライントレースカーに模様替えしました。
先ずは動画をご覧下さい。
回路図
部品店すっが少なく簡単な回路です。使用部品も通販で買えるものばかりです。
Raspberry Pi PicoにはADC入力が3ヶ所用意されているので、左右と中央のフォトセンサーに丁度使えます。
補足:Raspberry Pi PicoのADCはMicro Pythonでは16ビット1 から 65535の分解能を得れます。ArduinoIDEで
Raspberry Pi Picoを使うためにArduino Mbed OS RP2040 Boardsをインストールした場合は、分解能が
仕様書の12ビットではなく、他のArduinoボードと同様に10ビット1~1023が出力されます。

心臓部にRaspberry Pi Picoを使う
ロボットコンテストの副賞に貰ったRaspberry Pi Picoをそろそろ何かに使わないとと思い立ち、通信機能が不要な
ライントレースカーに使うことにしました。
Raspberry Pi Picoの取り付けには、コネクターを使わずに基板を躯体にビス止めして、GPIO端子に直接配線を
行っています。USBソケットへのケーブルプラグの差し込みは、ホイールの隙間から行えます。
プログラムはArduino IDEを使って簡単にまとめましたが、Micro Pythonでも可能です。

ラインを読むセンサーにポピュラーなTCRT5000を使用
このセンサーは2017年7月に掲載の「Inverted Balancing Robot(倒立振子型ロボット)その9」で倒立ロボットの
ライントレース化に使ったセンサー基板がジャンクボックスに残ってたのを流用しました。
新たに購入される方は、オペアンプを内蔵してしきい値をVRで調整できる基板が安価に販売されています。
これを利用すると、アナログ入力(ADC)ではなくデジタル入力で使えますが、基板が3枚必要です。
後部の受けは、電池ボックスにダイソーのワイヤーハンガーを貼り付けただけの簡単な方法です。
ギアモーターとモータードライバー
モーターやモータードライバーユニットは倒立振子ロボットに組み込んだものを躯体ごと流用。
倒立振子ロボットの縦型配置を横に寝かせただけです。

電源について
電池ボックスを単4型電池4個用から2個用に取り換えて2.4Vで使うことにしました。
その理由は、4.8Vだとギアモーターの回転が速すぎてヘアピンカーブが曲がり切れません。
通常回転数を下げる方法としてPWM(パルス幅変調)を使いますが、Raspberry Pi Picoの入力電圧が2.1Vからに
対応していることと、電池を減らせば軽くなるメリットが有り電圧を下げる方法を用いました。

ライントレースのコースについて
私は10㎜厚、900×600㎜の発泡スチロールパネルに幅19㎜の電工用黒色ビニールテープを貼り付けて
コースを作りました。冬場はビニールテープが伸びにくくてカーブを描くのが難しいですが、ドライヤーで
温めながら行うと上手く行えます。

皆様の参考になれば幸いです。
by Paradise