1

Arduino – ロータリーエンコーダ改

Arduino – ロータリーエンコーダを回すのコードがアレだったのでシンプルに書き直した。回路はそのままで。

char rot_state; // 状態 0~3
char rot_pinA = 8; // PinA of RotaryEncoder
char rot_pinB = 9; // PinB
void setup()
{
  Serial.begin(9600);
  pinMode(rot_pinA, INPUT);
  pinMode(rot_pinB, INPUT);
  rot_state = rotary_getState(rot_pinA, rot_pinB); // 現在の状態を保存しておく
}
void loop()
{
  // ロータリーエンコーダの状態を監視して、PCにシリアル通信で送る
  char rot_past = rot_state;
  rot_state = rotary_getState(rot_pinA, rot_pinB); // 今の状態
  char rot_dir = rotary_getDir(rot_state, rot_past); // 回転方向
  switch(rot_dir){
    case 2:
      Serial.println("R"); // 右回転
      break;
    case 1:
      Serial.println("L"); // 左回転
      break;
  }
  delayMicroseconds(10);
}
/* ロータリーエンコーダの状態番号0~3を取得する */
char rotary_getState(char pinA, char pinB){
  // 2つのピンからの入力状態をチェック
  if(digitalRead(pinA)){
    if(digitalRead(pinB)) return 2;
    else return 0;
  }
  else{
    if(digitalRead(pinB)) return 1;
    else return 3;
  }
}
/* 1つ前の状態と比較して、回転方向を取得する */
char rotary_getDir(int state, int past_state){
  if((state+3+1)%3 == past_state) return 1; // 左回り
  else if((state+3-1)%3 == past_state) return 2; // 右回り
  return 0; // 変化無し
}

1

Arduino – ロータリーエンコーダを回す

Arduinoでロータリーエンコーダの回転を検出した。

ロータリーエンコーダは可変抵抗と異なり、アナログ値を出すのではなく回転方向を2byteでデジタル出力するので、無限に回転させる事ができる。マウスのホイールもロータリーエンコーダで出来ている。

Source Code (Arduino 0009 Alpha / ATmega8 16MHz)

基本的に回路もプログラムもATMega8でやったのと全く同じ方法でできた。

s.h.log: AVR – mega8でロータリーエンコーダを回す

ロータリーエンコーダーの真ん中の足をGNDに接続し、左右の足をそれぞれマイコンのピンに接続。また、左右の足とマイコンのピンの間で、10kΩの抵抗を使ってプルアップする(VCCに接続する)

まあ写真の通り。

インクリメンタル型ロータリーエンコーダーは2本の線で4種類の回転状態を出力する。1クリック回す(カチッと言う)と、4種類の状態が一回りする。

とりあえず状態に0,1,2,3と名前をつけて、10ms毎ぐらいに状態を見に行くと、状態が1増えていたら右に回転、減っていたら左に回転みたいな感じでわかる。

ただし、Arduinoにはタイマーが無いので、メインループ loop() の中で delayMicroseconds(10); を呼んで、10ミリ秒を作っている。

なので、ロータリーエンコーダと同時にタイミングが難しい処理を行うとおかしくなるかもしれない。

例えば赤外線の受信とか。

Read more

1

C#講座01 SerialPortクラスを使ってArduinoと連動させる(1/2)

VS2005 C#のSerialPortコンポーネントを使って、Arduinoとシリアル通信して連携する方法をビデオ撮ってみた。

今回はマイコン→PCの一方方向だけしかやらなかったので、逆はあとでやる。

VisualStudio C#.NETで

・新規ソリューションを作る

・その中に新規プロジェクトを作る

・ボタンやシリアルポートコンポーネントなどを配置してみる

・コンポーネントにイベント登録する

という事を解説してみた。

ソースコード一式

今回書いたのはこれだけ。でも、これもほとんどVisualStudioに自動生成される。

publicForm1()

{

InitializeComponent();

Console.WriteLine(“start”);

}

privatevoidserialPort1_DataReceived(objectsender,System.IO.Ports.SerialDataReceivedEventArgse)

{

Console.WriteLine(serialPort1.ReadLine());

}

privatevoidbutton1_Click(objectsender,EventArgse)

{

serialPort1.NewLine=”¥r¥n”;

serialPort1.Open();

}

0

ArduinoがEthernet対応しそう

Bluetooth版のArduinoが少しずつ研究室にも届き始めているわけだが、

イタリアでArduinoを作っているtinker.itより。今度はLANにつながるぞ。

tinker.it Blog Archive The Arduino Ethernet board

ENC28J60とuIPを使ったのでXPortよりコストを抑えられるとのこと。(コメント欄)

確かにENC28J60+uIP+ATmega8系マイコンのサンプルは結構あって、日本でもENC28J60-SPI変換キットがオプティマイズで2300円買える

Arduinoぐらい安い基盤でTCP/IP使えると、HTTPでいろいろfeed持ってきて単体で動作するwidgetが安く大量に作れて楽しそう。

誰かArduino用のhashと正規表現ライブラリ実装してくれればな。各feed用のパーサーとか言わないのでせめて。

2か月前にこんなの作ったんだけど

明日の天気を色で教えてくれるてるてる坊主 – 奥出研2007年春合宿 XPort班

現実的にはArduinoにはhashや正規表現や可変長の文字列が無いので、LANにつながってもUSBケーブルが長くなった程度でしかない。

PC無しで動くambient widget系と電子工作をmashupするなら、こういう風にPCを裏方のゲートウェイにしてしまって、そのPC上で天気のフィードを解析するとか、GoogleCalendarやdiggに認証するとか、の方が楽なので、Arduino部分がEthernetだろうがBluetoothだろうがUSBだろうが設置性以外はあまり変わらないんだけどね。

でもArduinoがEther対応はワクワクする。

0

FNCCでシリアル通信を受信

FNCCを使うと、シリアルポートを扱うクラスの無いFlashでもシリアルポートが使えるようになる。

FNCCのサイトで、COM-XMLSocketのproxy(.NETのexe)と、XMLSocketをシリアルポートみたいに見せるラッパークラス(AS2)が配布されている

Flash Net Comport Connector – Rapid prototyping tool series

こんな感じで受信できる。

importcom.hatayan.flashNetComportConnector.SerialPort;

this.stop();

varserial_net=newSerialPort();

serial_net.openRemoteComport(“localhost”,1888);

serial_net.onReceiveStr=function(serialObj:SerialPort){

recv_data=serialObj.getStr();

if(recv_data==’1′){

gotoAndStop(1);

}

elseif(recv_data==’0′){

gotoAndStop(2);

}

};

Read more