小学生ロボコン事前キャンプの時に、Arduino IDEからコードを引き抜いてきたコードで、ココロキットNEO互換機を作成しました。

ココロキットNEOの互換機としてArduino UNO ATmega328PとL293Dで構成し、元のソースコードでコンパイルしました。
ところがアナログピンに接続したマイクロスイッチがうまく動かず、pinMode関数”pinMode(A0, INPUT);”の引数を、INPUT_PULLUP”pinMode(A0, INPUT_PULLUP);”に変更したらうまく動くようになりました。
これはコンピュータのPINがどこにもつながっていない場合でもONとOFFを決めようした結果、ONとOFFがランダムに出るようになるので、+とーのはっきりした電圧を流すと、ONとOFFがどちらかに決まって正しく動くようになった。ということだと思います。
ということは元のNEOは、別のプルアップ抵抗が搭載されていたのでこうなったと思います。

このような外部のプルアップを用意する理由と利点がわからなかったので、メンターの大学院生に聞いてみました。
そうしたらこのURLを教えてくれました。

(私も外部のほうが良い理由を自力では答えられないのですが、このようなスレッドがありました)
https://qastack.jp/electronics/345707/why-do-we-need-external-pulling-resistors-when-microcontrollers-have-internal-pu

ここに書いてあることから、内部プルアップが低電力用に最適化されているため、適切な抵抗値が必要になる時に、外部抵抗を使用することがあるということを理解しました。
あとKURIKIT(Scratch)上で関数を作成した場合に、Arduinoのコード生成で実際の関数として生成されるのかどうかなど調べるのが面白いので、今日も頑張ろうと思います。

 

ココロキットNEO解析結果

マイコン Arduino Uno
モータードライバ L293Dモータードライバシールド
(モーター制御ライブラリにafmotor.hを使用している)
モーター電圧 回転速度100で3.3v
本体電圧 6V(ニッケル水素電池4本)
寸法
幅 167mm
縦 290mm
高 118mm
ゴール 94mm×160mm
ポール径 15mm
ポール台高 60mm
プラダン厚 4mm

コード
#include <Servo.h>
#include <AFMotor.h>
AF_DCMotor motor1(1);
AF_DCMotor motor2(2);
AF_DCMotor motor3(3);
AF_DCMotor motor4(4);
Servo myServo1;
Servo myServo2;
template <typename T_ty> struct TypeInfo { static const char * name; };
template <typename T_ty> const char * TypeInfo<T_ty>::name = “unknown”;
#define TYPE_NAME(var) TypeInfo< typeof(var) >::name
#define MAKE_TYPE_INFO(type) template <> const char * TypeInfo<type>::name = #type;
MAKE_TYPE_INFO( int )
MAKE_TYPE_INFO( float )
MAKE_TYPE_INFO( char )
int motorDirection(int duration, int direction){
if(duration < 0){
direction = direction == FORWARD ? BACKWARD : FORWARD;
}
return direction;
}
int joystickPos(int val){
float offset = 0.05;
int duty = 0;
if(val > 512 * (1 – offset) && val < 512 * (1 + offset)){
return duty;
}else{
duty = map(val, 0, 1023, -100, 100);
return duty;
}
}
int _random(int min, int max){
return int(random(min, max));
}
void setup() {
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
myServo1.attach(10);
myServo2.attach(9);
pinMode(LED_BUILTIN, OUTPUT);
Serial.begin(9600);
motor1.run(RELEASE);
motor2.run(RELEASE);
motor3.run(RELEASE);
motor4.run(RELEASE);
randomSeed(100);
}
float var_777a754c = 0.0;
void loop() {
/* Write here your code */
motor1.run(motorDirection(int(100), FORWARD));
delay(10);
motor1.setSpeed(255 * abs(100) / 100);
motor2.run(motorDirection(int(100), FORWARD));
delay(10);
motor2.setSpeed(255 * abs(100) / 100);
delay(0.2*1000UL);
if (digitalRead(A5) == HIGH){
motor1.run(motorDirection(int(100), BACKWARD));
delay(10);
motor1.setSpeed(255 * abs(100) / 100);
motor2.run(motorDirection(int(100), BACKWARD));
delay(10);
motor2.setSpeed(255 * abs(100) / 100);
delay(0.6*1000UL);
} else {
if (digitalRead(A4) == HIGH){
motor1.run(motorDirection(int(100), FORWARD));
delay(10);
motor1.setSpeed(255 * abs(100) / 100);
motor2.run(motorDirection(int(100), FORWARD));
delay(10);
motor2.setSpeed(255 * abs(100) / 100);
delay(0.6*1000UL);
}
/* ERROR: control_if_else */
}
}