fc2ブログ

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



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

コメントの投稿

非公開コメント

プロフィール

CNC_Paradise

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

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