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