アルコールセンサー MQ-3 と Arduinoで呼気中と血中アルコール濃度(BAC)測定 スケッチコード付

[`evernote` not found]
LINEで送る
Pocket

アルコールセンサー MQ-3 と Arduinoで呼気中と血中のアルコール濃度(BAC:blood alcohol concentration)測定をしてみた。

といってもDatasheetの[Rs/R0]/[mg/L]両対数グラフから近似式を手計算で算出して
変換しただけなので、実際の値とどれくらい近いのかは不明。
参考したURLのページでは、回帰分析しているんですが、いまいちな結果だったので、
今回の手計算で求めた近似式にしてみました。

なので、必ず、ご自分で確認をしてください。

ダイソーで買ってきたアルコールウェトテッシュ近づけると
値を出しましたが、近いかどうか誰か検証したら教えてね。

使用したモジュールはこちらのMQ-3モジュール

まず、キャリブレーションのためにR0値を測定する
スケッチは下記。ここで計算されるR0値はメモっておきましょう。

// キャリブレーションのためにR0を計測する
// MQ-3 Pin1 VCC → Arduino 5V
// MQ-3 Pin2 GND → Arduino GND 
// MQ-3 Pin3 DOUT:アルコール検出でHIGH出力する  → 今回は不使用
// MQ-3 Pin4 AOUT:アルコールレベルのアナログ出力 → Arduino A0
// Wind Abaft Co., Ltd.

void setup()
{
   Serial.begin(9600);
}

void loop()
{
    float sensor_volt;
    float RS; // 空気中のRS値
    float R0; // アルコール中のR0値
    float sensorValue;

    for(int i = 0 ; i < 100 ; i++)
    {
        sensorValue = sensorValue + analogRead(A0);
    }

    sensorValue = sensorValue/100.0;     //平均値の算出
    sensor_volt = (sensorValue/1024)*5.0;  //ArduinoのPWMは10ビット1024
    RS = (5.0-sensor_volt)/sensor_volt; // 省略 RL
    R0 = RS/60.0; // きれいな空気中のRS/R0=60
    Serial.print("R0 = ");
    Serial.println(R0);
    delay(1000);

}

まず呼気中のアルコール濃度を求めるのに、下記グラフから手計算で下記の近似式を作った。
検算していないので間違っているかも。

BAC(呼気中のアルコール濃度[mg/L]) = pow(10,-1*(((log10(ratio))+0.2391)/0.6008))

MQ-3 アルコール濃度両対数グラフ
MQ-3 アルコール濃度両対数グラフ

この式と先ほど求めたR0値をもとに呼気中アルコール濃度算出する。
一般的に,呼気中アルコール濃度[mg/L] : BAC[mg/ml] = 1:2
とのことなので、それを元に2倍してBAC[mg/ml]出した。

先ほどの測定で得た
R0値
を、下記に代入してみてください

// キャリブレーションのために測定したR0の値を利用する
// MQ-3 Pin1 VCC → Arduino 5V
// MQ-3 Pin2 GND → Arduino GND 
// MQ-3 Pin3 DOUT:アルコール検出でHIGH出力する  → 今回は不使用
// MQ-3 Pin4 AOUT:アルコールレベルのアナログ出力 → Arduino A0
// Wind Abaft Co., Ltd. Fumiyoshi.Yotsugi

#include <math.h>
void setup() 
{
    Serial.begin(9600);
}

void loop() 
{
    float sensor_volt;
    float RS_gas; // 測定対象のガス中のRS値
    double ratio; // RS_gas/RS_air 空気中のRS割合
    double BAC;
    int sensorValue = analogRead(A0);
    sensor_volt=(float)sensorValue/1024*5.0;
    RS_gas = (5.0-sensor_volt)/sensor_volt; // 省略 *RL

   /*- "R0" を先ほど計測した値に置き換えてください -*/
    ratio = RS_gas/R0;  // ratio = RS/R0   
    BAC = pow(10,-1*(((log10(ratio))+0.2391)/0.6008));  // mg/L中のBAC
    Serial.print("呼気中BAC[mg/L] = ");
    Serial.println(BAC); // 呼気中のアルコール濃度[mg/L]
    Serial.print("\n");
    Serial.print("血中BAC[mg/ml] = ");
    Serial.println(BAC*2);  // 血液内のアルコール濃度[mg/ml]に変換(1:2)
    Serial.print("\n\n");
    delay(1000);
}

ちなみに本モジュールはアルコールに反応して(アルコール濃度が閾値をこすと)、
D3 Pin (D Out)がhighを出力して、モジュール裏面のチップLEDが点灯します。

上記の私の式だと0.01[mg/L]で、モジュール裏面のチップLEDが点灯してしまうので
敏感すぎるかなーという感じですね。
より更正していく必要がありそうです。

参考:https://www.teachmemicro.com/mq-3-alcohol-sensor/
データシート:https://www.sparkfun.com/datasheets/Sensors/MQ-3.pdf

アルコール濃度の運転技能へ与える影響は下記だそうです。

悪影響を与える運転技能 血中アルコール濃度
(mg/mL)
呼気中アルコール濃度
(mg/L)
注意の集中 0.05 [0.025]
反応時間 0.2 [0.1]
追跡技能 0.2 [0.1]
多方面への注意 0.2 [0.1]
ハンドル操作 0.3 [0.15]
視覚機能(視線の固定が困難) 0.4 [0.2]
規則遵守 0.5 [0.25]

出典元:https://www.asahibeer.co.jp/csr/tekisei/drink_drive/effect.html

ちなみに法定の酒気帯び基準は下記(参照:警察庁
呼気中アルコール濃度0.15[mg/L]以上からアウトだそうです。

酒酔い運転

(「酒酔い」とは、「アルコールの影響により車両等の正常な運転ができない状態」をいう。)

  • 基礎点数35点
    免許取消し 欠格期間3年(※)

酒気帯び運転

  • 呼気中アルコール濃度0.15mg/l 以上 0.25mg/l 未満
    基礎点数13点
    免許停止 期間90日(※)
  • 呼気中アルコール濃度0.25mg/l以上
    基礎点数25点
    免許取消し 欠格期間2年(※)
[`evernote` not found]
LINEで送る
Pocket

ダストセンサー DSM501AでPM1.0 と PM2.5 の測定してみた Arduino スケッチコード付

[`evernote` not found]
LINEで送る
Pocket

ダストセンサーDSM501AでPM1.0(以上の)粒子数カウントしてみた

PM1.0を計測できるのか?と思いきや
PM1.0以上のサイズの粒子をカウントできるよというもののようだ。

PWM出力されるパルスを30秒間計測して、その中でLOWパルス幅の全体に占める比率から
粒子数を出すというもの。

もちろん、データシートにメーカー側が
「Lowパルス幅の占有率に対する粒子数」
のグラフを用意してくれているので、そのグラフを元に粒子数出してる。
(合っているのか?)

とりあえず、いろんな所で計測してみて、自分でも
この値からは空気が悪そうだというデータをとったほうが良さそうな気もする。

ピン配置は下記で左からPin1~Pin5

Pin1: コントロール(Vout1用のコントロール)
Pin2: Vout2 (PM1.0以上計測用)
Pin3: VCC
Pin4: Vout1  (PM2.5以上計測用)
Pin5: GND

以下が今回使ったArduino用スケッチコード

// DSM501A Pin3 → Arduino 5V
// DSM501A Pin5 → Arduino GND
// PM1.0以上を計測したい場合:DSM501A Pin2 → Arduino D8
// PM2.5以上を計測したい場合:DSM501A Pin4 → Arduino D8
// Wind Abaft Co., Ltd.

#include<string.h>
byte buff[2];
int pin = 8;//DSM501A input D8
unsigned long duration;
unsigned long starttime;
unsigned long endtime;
unsigned long sampletime_ms = 30000; // データシートの計測方法が30秒のため
unsigned long lowpulseoccupancy = 0;
float ratio = 0;
float concentration = 0;
 
int i=0;
void setup()
{
  Serial.begin(9600);
  pinMode(8,INPUT);
  starttime = millis(); 
}
void loop()
{
  duration = pulseIn(pin, LOW);
  lowpulseoccupancy += duration;
  endtime = millis();
  if ((endtime-starttime) > sampletime_ms)
  {
    ratio = (lowpulseoccupancy-endtime+starttime + sampletime_ms)/(sampletime_ms*10.0);  // Integer percentage 0=>100
    concentration = 1.1*pow(ratio,3)-3.8*pow(ratio,2)+520*ratio+0.62; // データシートのグラフ参照
    Serial.print("lowパルス幅(30秒間):");
    Serial.print(lowpulseoccupancy);
    Serial.print("    Lowパルス幅の占有率[%]:");
    Serial.print(ratio);
    Serial.print("    DSM501A計測粒子数[pcs/283ml]:");
    Serial.println(concentration);
    lowpulseoccupancy = 0;
    starttime = millis();
  } 
}

 

[`evernote` not found]
LINEで送る
Pocket

中華USBシリアル変換ドライバ CH340, CH340G のアンインストール(uninstall)方法

[`evernote` not found]
LINEで送る
Pocket

激安のArduino互換機に搭載されている事が多い
CH340, CH340Gといった中国製USBシリアル変換ICを使用するには
専用のドライバーを別途インストールする必要があります。

しかし、MacではOSのバージョンによってはカーネルパニックを起こしたり、
インストールするしても認識しないなどの不具合が起ります。

それで、アンインストールしたいけど、アンインストールどうやってやるのと言う人多いと思うので
ここに書いておきますので、ご参考にして貰えればと思います。

1. MACのターミナル開く(黒い画面アイコンのやつ)
2. 下記コマンドを入力する

※V1.0 ~ V1.3などの古いドライバー向けが一つ目のコマンドで、最近のものは二つ目のコマンドが対応という感じです。

sudo rm -rf /System/Library/Extensions/usb.kext
sudo rm -rf /Library/Extensions/usbserial.kext

ドライバーのバージョンの新旧で保存場所が変わったため、上記のようになっています。

 

ちなみにMacにArduino等を接続した際に認識しているのかを確認する方法
ターミナルで

ls -l /dev/tty.*

を実行してみましょう。
USBポートに接続されている機器の名前が表示されます。Arduinoだと下記のような感じの名前が表示される
例:/dev/tty.usbmodem1421

マウスなどの他に接続しているUSB機器の名前も表示されるので間違わないように。

[`evernote` not found]
LINEで送る
Pocket

ArduinoでI2Cを使って格安LCDの1602に文字を表示させよう!

[`evernote` not found]
LINEで送る
Pocket

写真左の格安液晶モジュール1602に
写真右のI2C アダプターを利用して、簡単に文字を表示させることができます。

LCDにI2Cドライバを実装(要ハンダ付)

下記のようにI2CモジュールとArduino UNOを繋ぐ
I2Cモジュール → Arduino UNO
GND → GND
VCC → 5V
SDA → A4
SCL → A5

まずは、LiquidCrystal_I2C ライブラリをダウンロードして取り込み。

LiquidCrystal_I2C ライブラリ

スケッチは下記

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {
  lcd.init(); 
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Hello, world!!");
}

void loop(){
}

どうでしょうか?表示されましたか?

画面が真っ青であったり、何も映らない場合には、モジュール裏面の可変抵抗がLCDコントラスト調整ツマミ
になっているので回して調整してみてください。

モジュール裏面のA0, A1, A2はハンダブリッジの組み合わせでアドレスを変更できます。
1個も半田ブリッジが無い「全てオープン」の状態では、デフォルトの
「0x27」
となっています。

LCDもI2Cモジュールも150円くらいで手に入るので、

約300円程度でArduinoに簡単に液晶表示をさせることができるようになります。

[`evernote` not found]
LINEで送る
Pocket

5分でできる!BluetoothでArduino遠隔操作ラジコンカー製作 (DCモーター制御) スケッチコード付き

[`evernote` not found]
LINEで送る
Pocket

前回解説した
すぐにできる!Arduinoで赤外線ラジコンカー製作 (DCモーター制御) スケッチコード付き
Bluetooth版になります。
しかも、
①前回のキットにBluetoothモジュールを接続(四本のワイヤ接続するだけ!)
②本ページのコードをArduinoに上書きするだけ
なんと、5分もかかりません。

材料:
1. 前回使用キットそのまま
2. HC-06 (Bluetoothモジュール)×1 ※技適なしのモジュールになります。ご使用方法についてはご注意ください
3. ジャンパワイヤ×4

製作方法:
① 下記のように接続します。HC-06とArduinoのTX, RXを互いに逆に接続することに注意!

HC-06 Arduino UNO R3
 VCC  ⇒  5V
 GND  ⇒  GND
 TXD  ⇒  RX
 RXD  ⇒  TX

 

②下記スケッチコードをArduinoに書き込む(書き込む際は必ずHC-06を停止させてください、VCC抜くだけでOK)
何度もモーターの回転についてのコードがでてきますが、分かりやすくするためにわざと重複して書いてます。
分かる方はリファクタリングして短くまとめてください。

③PCもしくはスマホで操作
【PCの場合】:bluetoothペアリング後にArduino IDEのツール⇒シリアルポートでHC-06を選択
シリアルモニタを立ち上げて、そこに”test”と入力すると、”Hello, Wind Abaft”と返ってくれば成功です。
同じようにシリアルモニタに下記を打つとその対応のままラジコンが動作します。
f: 前進
r: 右折
l: 左折
b: 後進
R(大文字のR):右回転
L(大文字のL): 左回転
s: 停止

【スマホの場合】:HC-06はiPhoneに対応していないのでAndroidスマホでのみ操作が可能(頑張ればiPhoneもいけるかもしれない)
アプリArduino bluetooth controllerをgoogle Playからインストール(無料)
アプリの各ボタンに上記7種類の文字をあてはめるだけ!あとはペアリングするだけでコントロールが可能
例. →マークに”r”を当てはめる

#include <IRremote.h>
// Author Fumiyoshi.Yotsugi @ Wind Abaft Co.,Ltd.

char val;
int RECV_PIN = 12; //IR受信データピンを12に設定
int ledpin=13;

IRrecv irrecv(RECV_PIN);
decode_results results;

// モーターコントローラー(L298N)とArduino UNO R3の接続
// motor A
int enA = 5;
int in1 = 2;
int in2 = 4;
// motor B
int enB = 10;
int in3 = 7;
int in4 = 8;


void setup()

{
irrecv.enableIRIn();
Serial.begin(9600);
pinMode(ledpin,OUTPUT);

// モーターコントロールピンをoutputにセット
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void loop() {
val=Serial.read();
performCommand();
if(val=='test')
{
digitalWrite(ledpin,HIGH);
delay(500);
digitalWrite(ledpin,LOW);
delay(500);
Serial.println("Hello, Wind Abaft!");
}

if (irrecv.decode(&results)) {
irrecv.resume();

if (results.value == 0x00FF629D){ // ↑ボタンを押すと前進

  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  // スピードは 200に設定、 0~255の範囲で設定できるが100以下だとV不足で回らないこともある
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  // スピードは 200に設定、 0~255の範囲で設定できるが100以下だとV不足で回らないこともある
  analogWrite(enB, 200);

}else if(results.value == 0x00FF22DD){ // ←ボタンを押すと左折する 

 // motor Aを前進させてmotor Bは止める
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
  
}else if(results.value == 0x00FF6897){ // ボタン1を押すと左回転 

 // motor Aは前進、motor Bは後進
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200);
  
}else if(results.value == 0x00FFC23D){ // →ボタンを押して右折する 

// motor Aは止めてmotor Bは前進 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);

}else if(results.value == 0x00FF9867){ // ボタン2を押すと右回転 

// motor A後進、motor B前進 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);

} else if(results.value == 0x00FFA857){ // ↓ボタン押すと後進(バック)

// motor A後進、motor B後進 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200);

}else if(results.value == 0x00FF02FD){ // OKボタン押すと停止(ストップ) 

// motor A停止、motor B停止 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);

}
}
}

void performCommand() {
if (Serial.available()) {
val = Serial.read();
}
if (val == 'f') { // 前進
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
  Serial.println("Forward");
} else if (val == 'b') { // 後進
 digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200);
} else if (val == 'r') { // 右折
 digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
} else if (val == 'l') { // 左折
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
} else if (val == 's') { // 停止
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
}
 else if (val == 'R') { // 右回転
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 200);
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
}
 else if (val == 'L') { // 左回転
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200);
}
}

【追記】
006Pの9V角型電池1個でArduinoとBluetooth(HC-06)に電源供給していると
電流不足からか、たまに不安定になることもあったので、アルカリ電池4本以上の電源を繋いだところ安定しました。
長い時間遊ぶ場合はアルカリ電池4本以上の電源(電池ボックス)に繋ぐことをお勧めします。

[`evernote` not found]
LINEで送る
Pocket

すぐにできる!Arduinoで赤外線ラジコンカー製作 (DCモーター制御) スケッチコード付き

[`evernote` not found]
LINEで送る
Pocket

Arduino UNO互換機を使って、DCモーターを赤外線で制御してラジコンを作成します。

材料
1. Arduino 2輪駆動 三輪スマートカー車体キット(Yahoo!ショッピングAmazon
2. Arduino(互換品) UNO R3
3. モータードライバー L298N
4. 赤外線受信モジュール(CHQ1838, 5V, 周波数:37.9KHz)
5. IRワイヤレスリモコン
6. アルカリ電池(単三×4、9V型角型電池×1)
7. 9V型角型電池用ホルダー×1、DCプラグ端子台×1
8. UNO R3ボード固定用ネジ×1・ナット×2、L298Nモジュール固定用ネジ×2・ナット×4、IR受信モジュール固定用ネジ×1・ナット×2、9V型角型電池用ホルダー固定用ネジ×2、ナット×2

上記全部セットはこちら(Yahoo!ショッピングAmazon)で買えます

写真のように組立をしていきます。
①下段車体にモーター2個と車輪3個を取り付ける
②下段シャーシにL298Nモータードライバーを取り付ける
③モーター2個とL298NのMOTORA、MOTORBとを繋ぐ(要マイナスドライバー)
④上段シャーシにArduino UNOと単三用電池ボックス、9V角型電池用ボックスを取り付ける
⑤単三電池ボックスのプラスマイナス導線をL298NのGNDとVMSに繋ぐ

 

⑥Arduino UNOとL298Nモータードライバーを下記のように接続する
※上段と下段のシャーシはまだネジで接続して固定しない(最後に行う)
※Arduinoへの接続ピン番号は適当に選んで繋げただけなので、自由に変更してOKです。
それに合わせてスケッチ内の該当ピンナンバーを変更するだけで動きます。

L298NとArduinoのピン接続は下記
ENA ⇒ 5
IN1 ⇒ 2
IN2 ⇒ 4
IN3 ⇒ 8
IN4 ⇒ 7
ENB ⇒ 10

⑦IRレシーバーモジュールとArduinoを下記のようにピン接続する
S ⇒ 12
+ ⇒ 5V
GND ⇒ GND

⑧Arduinoに下記スケッチを書込む⇒リモコン操作で動作確認できたら、上段と下段のシャーシをネジで固定するのをお勧め(配線間違いで何度もネジを外したりするのを避ける為)⇒終了
【詳細】
IRワイヤレスリモコンの7つのボタンを前、後、左、右、停止、右回転、左回転に使用します。
また、使用する7つのボタンを下記のように解析したので、そのHEXコードをスケッチ内で使用します。
※リモコン毎に赤外線コード割り当てが違うので、動かない場合にはご使用のリモコンの赤外線コードを解析して、スケッチ内の該当箇所を変更してください
↑(前): 0x00FF629D
↓(後): 0x00FFA857
→(右): 0x00FFC23D
←(左): 0x00FF22DD
OK(停止): 0x00FF02FD
1(左回転): 0x00FF6897
2(右回転): 0x00FF9867

下記がUNO R3用のスケッチコード

#include <IRremote.h>
// Author Fumiyoshi.Yotsugi @ Wind Abaft Co.,Ltd.

int RECV_PIN = 12; //IR受信データピンを12に設定

IRrecv irrecv(RECV_PIN);
decode_results results;

// モーターコントローラー(L298N)とArduino UNO R3の接続
// motor A
int enA = 5;
int in1 = 2;
int in2 = 4;
// motor B
int enB = 10;
int in3 = 7;
int in4 = 8;


void setup()

{
irrecv.enableIRIn();

// モーターコントロールピンをoutputにセット
  pinMode(enA, OUTPUT);
  pinMode(enB, OUTPUT);
  pinMode(in1, OUTPUT);
  pinMode(in2, OUTPUT);
  pinMode(in3, OUTPUT);
  pinMode(in4, OUTPUT);
}

void loop() {

if (irrecv.decode(&results)) {
irrecv.resume();

if (results.value == 0x00FF629D){ // ↑ボタンを押すと前進

  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  // スピードは 200に設定、 0~255の範囲で設定できるが100以下だとV不足で回らないこともある
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  // スピードは 200に設定、 0~255の範囲で設定できるが100以下だとV不足で回らないこともある
  analogWrite(enB, 200);

}else if(results.value == 0x00FF22DD){ // ←ボタンを押すと左折する 

 // motor Aを前進させてmotor Bは止める
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);
  
}else if(results.value == 0x00FF6897){ // ボタン1を押すと左回転 

 // motor Aは前進、motor Bは後進
  // turn on motor A
  digitalWrite(in1, HIGH);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200);
  
}else if(results.value == 0x00FFC23D){ // →ボタンを押して右折する 

// motor Aは止めてmotor Bは前進 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);

}else if(results.value == 0x00FF9867){ // ボタン2を押すと右回転 

// motor A後進、motor B前進 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, HIGH);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);

} else if(results.value == 0x00FFA857){ // ↓ボタン押すと後進(バック)

// motor A後進、motor B後進 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, HIGH);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, HIGH);
  analogWrite(enB, 200);

}else if(results.value == 0x00FF02FD){ // OKボタン押すと停止(ストップ) 

// motor A停止、motor B停止 
  // turn on motor A
  digitalWrite(in1, LOW);
  digitalWrite(in2, LOW);
  analogWrite(enA, 200);
  // turn on motor B
  digitalWrite(in3, LOW);
  digitalWrite(in4, LOW);
  analogWrite(enB, 200);

}

}

}

※2WD3輪車体の場合、モーターを付けていない白の後輪車輪が動いてしまい、前進や後進時に曲がって進んでしまいます。4WD4輪車体の場合には、それが解消されますので、気になる場合には4WD4輪車体をご利用ください

【完成写真】


ロボットスクール様や塾で教材として使用したい方向けに、本資材のご提供やカスタマイズ、出張講義も可能です!

是非お問い合わせください!

[`evernote` not found]
LINEで送る
Pocket

Arduino互換機「びんぼうでいいの」に生AVR載せてブートローダーを簡単に書込む

[`evernote` not found]
LINEで送る
Pocket

Aitendoから販売されている
「びんぼうでいいの」
シリーズ。だいたい500円くらいで手に入る。

いわゆる格安Arduino互換機というもの。

最近ではAmazon等で、他にも安く互換機が手に入るようになったので、
もう、「びんぼうでいいの」は卒業という人も多いかもしれない。

しかも、他の互換機に使われているUSB → TTL変換チップは、ほぼ
CH340
中国の江苏沁恒股份有限公司(http://www.wch.cn/)というところが出している
チップ搭載なので、デバイスドライバーも基本的にほぼ同じ。

なので尚更、「びんぼうでいいの」を買ってきて、
ブートローダー書込みからスタート!という人は少なくなったかも?だが、

誤配線してマイコン破壊してしまった!とかそういうときにマイコンだけ交換というのはよくあるかと。

それで、

生AVRマイコン(空のATMega328P-PU)にブートローダーを書込む方法をご紹介。

びんぼうでいいいのにブートローダーを書込む

【用意するもの】: Arduino UNO×1、びんぼうでいいの×1、ジャンパワイヤー×6、AVRマイコン ATMega328P-PU ×1、Arduino IDEをインストールしたパソコン×1

【配線】: 下記写真のように繋ぐ
※秋月電子でATMega328P-PUは250円/1個 2017年7月4日時点

【書込み手順】:Arduino IDE → ファイル → スケッチ例 → Arduino ISP を選択 → Arduino UNOにそのまま書き込む 
ツール → ボード → Arduino/Genuino Uno を選択 → 書込装置 → Arduino as ISP を選択 → ブートローダを書込む

これだけでOK! 「びんぼうでいいの」ボード上の緑のLEDが点滅したら書込み成功

[`evernote` not found]
LINEで送る
Pocket