ライントレースカー ソフト編 その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