備忘録

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

RaspberryPiから、Arudinoを制御 Doragon Remote Control版 その2

前回までのは↓
RaspberryPiから、Arudinoを制御 Doragon Remote Control版
http://nanicananica.blog.fc2.com/blog-entry-20.html

実際にArduinoにDRC(Doragon Remote Control)を入れて
動かしてみるのだけれど、コマンド'@'のpingは通るけど、
Arduino A0ピン読み出し(コマンドa0)が上手くいかない

なんでかなと思ったら、
PCからminicomで、コマンド"a0"送信すると、当たり前だけれども
アスキーコードにして"0x40 0x30"が飛ぶわけです。

DRCファームは、アスキーコード"0x30"をコマンド"0"としてみてくれないため
A0を読む処理まで行ってなかったです
DRCファームには、"0x40 0x01"を送信しなければいけなかったわけです。

阿呆なミスでした・・・

ただ、これですといろいろと面倒なので、DRCファームを修正しました。
修正したものが↓
https://docs.google.com/file/d/0B3Shzpx27ZKgZUs2WjdTR0YtMjg/edit?usp=sharing

int myGetchar ()
{
int x ;
while ((x = Serial.read ()) == -1)
;
if(x>=48 && x<=57)
x = x-48;

return x ;
}

なんのことはない、0~9のアスキーコード(0x30~0x38)を受信したら、
0x0~0x9に変更するというだけです。

確認のため、温度計をつけたArduinoと、RaspberryPiを接続しました。
接続回路は↓
raspi_Arduino_temp.png
# 見づらくてすみません
Arduinoは5V系なので、RasPiとの接続は、↓のレベルコンバータを挟んでいます
https://strawberry-linux.com/catalog/items?code=18187
LM60は温度計でArduinoのA0に接続しています

RaspberryPiでテスト用に利用したコードは、↓です

- - - - - DRC_DRC_analogRead_002 - - - - - -
#include <stdio.h>
#include <string.h>

#include <wiringPi.h>
#include <wiringSerial.h>

int main(){

/* シリアルポートオープン */
int fd = serialOpen("/dev/ttyAMA0",115200);
if(fd<0){
printf("can not open serialport");
}

while(1){
/* 受信処理 */
while(serialDataAvail(fd)){
printf("%02x\n" , serialGetchar(fd) );
fflush(stdout);
}

/* 送信処理 */
serialPuts(fd,"a0");

delay(1000);
}

return;
}

- - - - - - - - - - - - - -

実行結果は。。。。
00
77

Arduino A0ピンのセンサー値を取得しました。
# 上位バイト、下位バイトの順で出力されます

上記の値は、ArduinoがAD変換した生の値なので、実際の値は。。。
0077h -> 119d
4.9mV*119 = 583.1mV がA0ピンで取得した電圧値

温度センサLM60BIZのデータシートを見ると、出力電圧と、
温度の関係が以下の式で表されています。
Vo = (+6.25[mV/℃] * T[℃])+424[mV]
このため
T = (Vo-424)6.25
 = 25.44[℃]

大体あってそうですね
スポンサーサイト

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/05/19(日) 18:54:50|
  2. Arduino
  3. | トラックバック:0
  4. | コメント:0

RaspberryPiから、Arudinoを制御 Doragon Remote Control版

ものをいじる時間がない・・・
wiringPiの本家Gordons Projectsを見ていたら、Doragon Remote Control(DRC)という
Arduinoをシリアル通信でつないで、コマンドをつかった会話で操作するようなものがあるみたい
http://projects.drogon.net/drogon-remote-control/drc-protocol-arduino/


同じようなものにFirmataというものがあります
http://firmata.org/wiki/Main_Page

折角なので、このDRC protocolに関しても
確認しておこうと思います。
ちなみに、DRCの実物は、↓にあります
http://projects.drogon.net/drogon-remote-control/drc-downloads/

DRC Protocol – Arduino

Arduino DueやUnoと会話をする時のシリアル通信プロトコルのドキュメントです。
また似たような、シリアル通信(USBホストを通して接続された)でつながるデバイスの為のドキュメントです。

シリアル通信は、ボーレート115200 ,data 8bit, 1stop bit,no parityの設定します。

次からのコマンドには、バイナリにてピン番号を示します。
そのため、もしminicomを通してコマンドを送るのなら、ピン番号3をコマンドを、文字"C"として入力します。
すべてのコマンドコードは、小文字です。

・Set pin mode:

デジタルピンには3つのモードがあります。
'o'(0x6F) を設定すると出力
'i'(0x69) を設定すると入力
'p'(0x71) を設定するとPWM出力 となります。
この後に、ピン番号が続きます。このため、3pinを出力に設定するためには、"0x6F 0x03"と2Byteを送ります。
コマンドのACK(応答)はありません

・DigitalWrite:
文字'0'(0x30)と'1'(0x31)はそれぞれロジックのLOWとHIGHを示し、これのあとにpin番号と続きます。
そのため、5pinをHIGHにしたい場合は、"0x31 0x05"と2Byteを送ります
13pinをLOWに設定したい場合は、"0x30 0x0D"とします

・PwmWrite

# 英文にはないですがPWM出力ピンの設定です
文字'v'(0x76)+pin番号と入れて、さらに3番目に0~255を表す値を示します。
9pinにディーティーサイクル50%を設定する場合は、"0x76 0x09 0x80"を送信します

・DigitalRead
文字'r'(0x72)+pin番号と入れて送信↓場合、そのピンの状態を読み取ることができます
pinのロジックレベルが、1Byteの'0'、'1'のどちらかで返されます
12pinを読みたい時は、"0x72 0x0C"と送信し、
ロジックれbるを示す'0'(0x30)か'1'(0x31)のどちらかが返信されてくることを期待できます

・AnalogRead:
文字'a'(0x61)+pin番号を送信することで、でアナログ値を読み取ることができます
アナログ値、2Byteが返信されてきますが、そのうち1番目のByteが上位バイトになります
例えば、4pinのアナログ値を読む場合、"0x61 0x04"を送信し、2Byteを返信されてきます。
もしデバイス側から0x10、0x5Cの順番で返信がきたら、"0x015C"で10進数384を示す値になります

・Ping:

基本的な命令テストとして、pingコマンドを送信することができます。
'@'か"0x40"にて、それを行うことができます。
リモートデバイスは、1Byteの'@'(0x40)を返信してきます。
シリアル通信の入力バッファをflushを必要なときは、デバイスとの接続確立のために何回か送信する

minicomなどのターミナルからテストをしたとき、2つの追加コマンドがあります。
'A':スペースキーが押されるまで、アナログポートの読み込みと表示を行います。
'X':スペースキーが押されるまで、デジタル入力の読み込みと表示を行います。
これらのコマンドは、ホストからプログラムをによる接続をしなくても、
ターゲットデバイスのテストに利用でき
機能をテストを可能にします。 続きを読む

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2013/05/10(金) 23:55:40|
  2. Arduino
  3. | トラックバック:0
  4. | コメント:0
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。