ポテンショメータをつないで

投稿日:

 次は、ポテンショメータをつないで、アナログ入出力をマスター。

 9番ピンを使用したパルス幅変調もわかったし、ついでに、さっきシリアルへのアクセス方法が分かったから、IDEに式ウォッチ機能がない代わりに、出力をシリアルにタレ流して観測する方法も会得。

IMG_2748

//
// ポテンショメータとLEDのPWM制御
//  佐藤俊夫
//  27.05.01(金)1604~
//
const int LED = 9;
const int POTENTIOMETER = 0;
//
void setup() {
  pinMode(LED, OUTPUT);
  pinMode(POTENTIOMETER, INPUT);
  Serial.begin(9600);
}

void loop() {
  int bright = 0;
  bright = analogRead(POTENTIOMETER) / 4;
  Serial.println(bright, DEC);
  analogWrite(LED, bright);
}



で、それじゃ、IoT風味で

投稿日:

 で、私がやりたかったのはコレなんである。

……つまり、このオモチャを、インターネットにつなぐ。これがやりたかった。

 あとはもう、

「メールが来たら旗があがる」

とか、

「録画が終わったら、人形が手を上げる」

とか、もう、なんぼでもアレンジ可能である。

 チナミに、Linuxだとこういうことをするのに大したことは書かなくてよく、

tail -n 0 -f /var/log/httpd/access_log | grep --line-buffered 'HTTP/1.1\" 200' | sed --unbuffered -e 's/..*/1/' >/dev/ttyACM0

……ぐらいの「ワン・ライナー」で済んでしまう。

 Arduino側のソースコードは、結局最終的には

//
//  シリアルからサーボを制御
//    佐藤俊夫
//    27.05.01(金) 0946~
//
#include <Servo.h>
//
Servo flag;
int incomingByte = 0;
const int FLAGOFF = 5;
const int FLAGON = 90;
//
void setup() {
  flag.attach(9);
  flag.write(FLAGOFF);
  Serial.begin(9600);
}

void loop() {
  if(Serial.available() > 0){  //  もし受信したデータが存在したら
    incomingByte = Serial.read();
    if(incomingByte == '1'){
      flag.write(FLAGON);
    }else if(incomingByte =='0'){
      flag.write(FLAGOFF);
    }
    Serial.flush();
    delay(1000);
  }    
}

……ぐらいの、お気楽な感じのモノになった。



シリアルで制御できたら、次は……

投稿日:

 次も、既にやることは決まっている。

 Arduinoをおもむろに手元のLinuxマシンにつなぐ。で、Linuxへ行って、rootになり、

# dmesg
usb 3-2: new full speed USB device using uhci_hcd and address 2
usb 3-2: configuration #1 chosen from 1 choice
usb 3-2: New USB device found, idVendor=2a03, idProduct=0043
usb 3-2: New USB device strings: Mfr=1, Product=2, SerialNumber=220
usb 3-2: Product: Arduino Uno
usb 3-2: Manufacturer: Arduino Srl
usb 3-2: SerialNumber: 75439333335351303121
cdc_acm 3-2:1.0: ttyACM0: USB ACM device
usbcore: registered new interface driver cdc_acm
drivers/usb/class/cdc-acm.c: v0.25:USB Abstract Control Model driver for USB modems and ISDN adapters

……となってればオッケーだ。

 で、

# ls -Fla /dev/ttyACM0
crw-rw---- 1 root uucp 166, 0 2015-05-01 11:50 /dev/ttyACM0

 よっしゃ、あるある。

 スピードなどはsttyで確かめると良い。

# stty -F /dev/ttyACM0
speed 9600 baud; line = 0;
-brkint -imaxbel

 オッケー。

 で、Linuxのコマンドラインから、旗を上げ下げする。

# cat /dev/ttyACM0 &
# echo '1' >/dev/ttyACM0

 おう、旗が上がる。

# echo '0' >/dev/ttyACM0

 ふふっ、旗が下がる。

 ……で、ここまで来たら、もうやりたいことはできたも同然w。



サーボが動かせたら、次は……

投稿日:

 次も、やることは決まっている。サーボが動かせたら、今度はそれをPCにつなぎ、シリアルから制御するのだ!

 ここでは、キャラクタ「’1’」を送信したら旗が立ち、それ以外だったら旗が降りる。

 やり方はカンタンだ。

  1.  サーボをArduinoにつなぐ。教科書通り電源をVinに、黄色をデジタル9番ピンに、茶色をアースに
  2.  プログラムを書く。
    //
    //  シリアルからサーボを制御
    //    佐藤俊夫
    //    27.05.01(金) 0946~
    //
    #include <Servo.h>
    //
    Servo flag;
    int incomingByte = 0;
    const int FLAGOFF = 0;
    const int FLAGON = 90;
    //
    void setup() {
      flag.attach(9);
      flag.write(10);
      Serial.begin(9600);
    }
    
    void loop() {
      if(Serial.available() > 0){  //  もし受信したデータが存在したら
        incomingByte = Serial.read();
        if(incomingByte == '1'){
          flag.write(FLAGON);
          Serial.println(incomingByte, DEC);
        }else{
          flag.write(FLAGOFF);
          Serial.println(incomingByte, DEC);
        }
        Serial.flush();
      }    
    }
    
    
  3.  IDEのシリアルモニタから「1」やその他の文字を入力・送信する。