fc2ブログ

ライントレースカー ソフト編 その2

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

Thonny.jpg

注意点
①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の場合と同様にしました。


  1. from machine import ADC, Pin ,PWM
  2. import utime
  3.  
  4. sensorL = machine.ADC(26) # Left GPIO 26
  5. sensorC = machine.ADC(27) # Center GPIO 27
  6. sensorR = machine.ADC(28) # right GPIO 28
  7. IN1 = PWM(Pin(6)) # GPIO 6
  8. IN1.freq(1000)
  9. IN2 = PWM(Pin(7)) # GPIO 7
  10. IN2.freq(1000)
  11. IN3 = PWM(Pin(8)) # GPIO 8
  12. IN3.freq(1000)
  13. IN4 = PWM(Pin(9)) # GPIO 9
  14. IN4.freq(1000)
  15. def forward(): # 前進
  16.     IN1.duty_u16(256*75)
  17.     IN2.duty_u16(0)
  18.     IN3.duty_u16(0)
  19.     IN4.duty_u16(256*75)
  20. def turnleft(): # 左旋回
  21.     IN1.duty_u16(0)
  22.     IN2.duty_u16(256*60)
  23.     IN3.duty_u16(0)
  24.     IN4.duty_u16(256*110)
  25. def turnright(): # 右旋回
  26.     IN1.duty_u16(256*110)
  27.     IN2.duty_u16(0)
  28.     IN3.duty_u16(256*60)
  29.     IN4.duty_u16(0)
  30. def stop(): # 停止
  31.     IN1.duty_u16(0)
  32.     IN2.duty_u16(0)
  33.     IN3.duty_u16(0)
  34.     IN4.duty_u16(0)
  35.     
  36. while True:
  37.     valueL = round(sensorL.read_u16()/256) # 左IRセンサー
  38.     valueC = round(sensorC.read_u16()/256) # 中央IRセンサー
  39.     valueR = round(sensorR.read_u16()/256) # 右IRセンサー
  40.     utime.sleep(0.05)
  41.     #print("L",valueL)
  42.     #print("C",valueC)
  43.     #print("R",valueR)
  44.     
  45.     if valueL <= 100: # しきい値 100以下は白(16ビットでは25600)
  46.         sensL = 0 # 白
  47.     else:
  48.         sensL = 1 # 黒
  49.     #print("L",sensL)
  50.     
  51.     if valueC <= 100: # しきい値 10以下は白0(16ビットでは25600)
  52.         sensC = 0 # 白
  53.     else:
  54.         sensC = 1 # 黒
  55.     #print("C",sensC)
  56.     
  57.     if valueR <= 100: # しきい値 100以下は白(16ビットでは25600)
  58.         sensR = 0 # 白
  59.     else:
  60.         sensR = 1 # 黒
  61.     #print("R",sensR)
  62.     
  63.     if sensL==0 and sensC==1 and sensR==0: # 前進
  64.         forward()
  65.     if sensL==1 and sensC==1 and sensR==1: # 前進
  66.         forward()
  67.     elif sensL==1 and sensC==1 and sensR==0: # 左旋回
  68.         turnleft()
  69.     elif sensL==0 and sensC==1 and sensR==1: # 右旋回
  70.         turnright()
  71.     elif sensL==0 and sensC==0 and sensR==0: # 停止
  72.         stop()



皆様の参考になれば幸いです。
by Paradise
スポンサーサイト



テーマ : 電子工作
ジャンル : 趣味・実用

ライントレースカー ソフト編 その1

Raspberry pi PicoをArduino IDEを使ってプログラミング
マイコンにRaspberry pi PicoとArduino Pro Microを使った2車体を作りましたが、どちらもArduino IDEを使って
プログラミングしました。何れの車体にも赤外線距離センサーを付けましたが、通常ライントレースカーは
2台同時に走らせることが無いのでその部分は省略しています。 前回までの製作編と併せてご覧下さい。
ArduinoIDE.jpg

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行目からはラインセンサーの読み取り値からコースの下地の白色とラインの黒色を識別する部分です。
しきい値は、使用するセンサーの種類、回路定数、取り付け方法、対物距離などによって出力値が変わるので
カットアンドトライで決めます。



  1. #define IN1 6 // GPIO 6
  2. #define IN2 7 // GPI0 7
  3. #define IN3 8 // GPIO 8
  4. #define IN4 9 // GPIO 9
  5. int Left_val;
  6. int Center_val;
  7. int Right_val;
  8. int L_SENS;
  9. int C_SENS;
  10. int R_SENS;
  11. void setup() {
  12.   Serial.begin(115200);
  13.   pinMode(IN1, OUTPUT); analogWrite(IN1 , 0);
  14.   pinMode(IN2, OUTPUT); analogWrite(IN2 , 0);
  15.   pinMode(IN3, OUTPUT); analogWrite(IN3 , 0);
  16.   pinMode(IN4, OUTPUT); analogWrite(IN4 , 0);
  17. }
  18. void Forward() { //前進
  19.   analogWrite(IN1, 75); // PWM 0〜255
  20.   analogWrite(IN2, 0); // PWM 0
  21.   analogWrite(IN3, 0); // PWM 0
  22.   analogWrite(IN4, 75); // PWM 0〜255
  23. }
  24. void Turnleft() { //左旋回
  25.   analogWrite(IN1, 0); // PWM 0
  26.   analogWrite(IN2, 60); // PWM 0〜255
  27.   analogWrite(IN3, 0); // PWM 0
  28.   analogWrite(IN4, 110); // PWM 0〜255
  29. }
  30. void Turnright() { //右旋回
  31.   analogWrite(IN1, 110); // PWM 0〜255
  32.   analogWrite(IN2, 0); // PWM 0
  33.   analogWrite(IN3, 60); // PWM 0〜255
  34.   analogWrite(IN4, 0); // PWM 0
  35. }
  36. void Stop() { //停止
  37.   analogWrite(IN1, 0); // PWM 0
  38.   analogWrite(IN2, 0); // PWM 0
  39.   analogWrite(IN3, 0); // PWM 0
  40.   analogWrite(IN4, 0); // PWM 0
  41. }
  42. void loop() {
  43.   Left_val = analogRead(26); // 左センサーの出力値 0〜255
  44.   Center_val = analogRead(27); // 中央センサーの出力値 0〜255
  45.   Right_val = analogRead(28); // 右センサーの出力値 0〜255
  46.   if (Left_val <= 100) { // しきい値 100以下は白
  47.     L_SENS = 0; // 白色
  48.   }
  49.   else {
  50.     L_SENS = 1; // 黒色
  51.   }
  52.   if (Center_val <= 100) { // しきい値 100以下は白
  53.     C_SENS = 0; // 白色
  54.   }
  55.   else {
  56.     C_SENS = 1; // 黒色
  57.   }
  58.   if (Right_val <= 100) { // しきい値 100以下は白
  59.     R_SENS = 0; // 白色
  60.   }
  61.   else {
  62.     R_SENS = 1; // 黒色
  63.   }
  64.   if (L_SENS == 0 && C_SENS == 1 && R_SENS == 0) { // Forwar 前進
  65.     Forward();
  66.   }
  67.   else if (L_SENS == 1 && C_SENS == 1 && R_SENS == 1) { // Forward 前進
  68.     Forward();
  69.   }
  70.   else if (L_SENS == 1 && C_SENS == 1 && R_SENS == 0) { // Turnleft 左旋回
  71.     Turnleft();
  72.   }
  73.   else if (L_SENS == 0 && C_SENS == 1 && R_SENS == 1) { // Turnright 右旋回
  74.     Turnright();
  75.   }
  76.   else if (L_SENS == 0 && C_SENS == 0 && R_SENS == 0) { // Stop 停止
  77.     Stop();
  78.   }
  79.   /*Serial.print(" L = ");
  80.     Serial.print(L_SENS);
  81.     Serial.print(" C = ");
  82.     Serial.print(C_SENS);
  83.     Serial.print(" R = ");
  84.     Serial.println(R_SENS);*/
  85. }



次回はMicro Pythonを使ったプログラミング例を紹介します。

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

テーマ : 電子工作
ジャンル : 趣味・実用

ライントレースカー パート3

車幅を狭く組み替えました。
コースが狭く対向時にホイール同士が接触するので車幅を約20㎜狭く組み替えました。
この改良により、ヘアピンカーブなどの対向時に接触することなく走行できるようになりました。

左側がリサイズ後の2号車(幅75㎜)、右側がリサイズ前の1号車(幅95㎜)です。
resizing1.jpg

左側が2号車(幅75㎜)、右側がリサイズ後の1号車(幅77㎜)です。
resizing2.jpg

動画をご覧下さい。


次回はソフトウエアーについて記す予定です。


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

テーマ : 電子工作
ジャンル : 趣味・実用

プロフィール

CNC_Paradise

Author:CNC_Paradise
木工・彫刻・機械工作・電子工作が
大好きで自作のCNCを使って工作を
楽しんでます。

最新記事
最新コメント
月別アーカイブ
カテゴリ
何でも工作室
検索フォーム
RSSリンクの表示
リンク
QRコード
QR