まごころせいじつ堂

浜町庄金 研究開発  マイコンで遊んでばっかりで

Arduino

PASOPIA ROMPAC1リーダをGG for Arduinoを使って書く

 東芝のPASOPIAはカセット形式で言語カートリッジが提供されている。これを読み取るためにArduino MEGA 2650用のシールドを作ったのだが、読み取ったデータをシリアルコンソール経由でコマンドを入力しダンプしたりするなどの操作をする部分が面倒で放置していた。
 あれから数ヶ月。最近、@mkogaxさんのGG for Arduinoライブラリを知りこれは便利そうだと早速使ってみた。

ハード側の説明:

ROMPAC1のピン配置は→  PASOPIA/PASOPIA7のROMPAC1

PASOPIARW基板 回路図
PASOPIARW-sch

レイアウト
PASOPIARW-pcb

 回路は大したことなくてジャンプワイヤーでもできるレベル。でもジャンプワイヤーでやったらうまくいかなかったので基板つくったの。
2022-05-27 19.38.58

 GG for Arduinoを使ったPASOPIAPAC1R.inoのスケッチはこちら。

使い方。公式ライブラリに登録してあるので、Arduino IDEのライブラリマネージャから トピック:コミュニケーションを指定して"GG"で検索。インストールする。
GG

以下はPASOPIAPAC1R.inoから引用しつつ説明。

gg_con_baud = 9600;
gg_start("\n*** PASOPIA ROMPAC1 READER ***\n"); // Start processing GG for Arduino

gg_start("タイトル");で使用開始。デフォルトでの通信速度は115200bpsだが、gg_con_baud変数を事前に変えておくと速度を変更できる。

gg_con_CmdInit();

デフォルトで内部のメモリダンプ用のコマンドが組み込まれているが、今回使わないのでまっさらにする。

GG_CON_CMDADD(PAC1_help, "h", "", "PASOPIA-PAC1 help" );
GG_CON_CMDADD(PAC1_help, "?", "", "PASOPIA-PAC1 help" );

組み込んであったhelpコマンドも消えるので自前で設定。GG_CON_CMDADD()でコンソールから指示できるコマンドを定義できる。
第1引数:コマンドで呼び出される関数
第2引数:コマンド名
第3引数:コマンドの引数の説明
第4引数:コマンドの使用方法説明

void PAC1_help(int argc, char **argv) {
  gg_con_CmdHelpAll();
}

ここで呼び出される関数は引数をargc,argvで渡すことができる。unixコマンドを自分で書いて追加するような感じ。

  gg_printf("%04X\n",PAC1_addr);

 とても便利なのが書式指定が使えるgg_printf()。このライブラリを知る前は自前でこんな感じにしてた。http://blog.livedoor.jp/hardyboy/archives/9620242.html
void sprinthex(unsigned long int x, int dg) {
  if (dg>=8) if (x<0x10000000) Serial.print("0");
  if (dg>=7) if (x<0x1000000) Serial.print("0");
  if (dg>=6) if (x<0x100000) Serial.print("0");
  if (dg>=5) if (x<0x10000) Serial.print("0");
  if (dg>=4) if (x<0x1000) Serial.print("0");
  if (dg>=3) if (x<0x100) Serial.print("0");
  if (dg>=2) if (x<0x10) Serial.print("0");
  Serial.print(x,HEX);
}
圧倒的に楽。

    if (isDigit(argv[1][0])) st = gg_asc2int(argv[1]);
gg_asc2int()で引数を数値に変換できる。このとき、"0x1000+256"のような式も評価してくれる。

    if (gg_GetC()==PAC1_BREAK) return;

if (hexflag) while(gg_GetC()<0);

 コマンド内でキー入力を見て、長いダンプリスト表示を中断させることもできる。また、PASOPIAPAC1RではIntel HEX形式でのダンプに対応しているがteratermのログに保存するときにプロンプトまで記録したくないので、ダンプ終了後のキー入力待ちも実現している。

 その他、GGにはミニFIFOバッファや日付変換、Arduinoの任意の端子を使ってトリガを出力する機能がある。ロガー用途などにも便利に使えそう。

 ということでGG for Arduinoはシリアルコンソールから対話的に操作する用途に有用です。



Arduino MEGA用ブレッドボードシールド

 はんだ付け不要のかんたんな工作です。

 ブレッドボードの片側の電源ラインを外すとArduino MEGAサイズにぴったりだったのでピンソケットを側面に接着してブレッドボードシールドを作りました。

 ブレッドボードは出っ張り部分をカッターナイフで削り、ピンソケットをセメダインスーパーXなどで接着。ピンソケットは10Px1、8Px5。それだけ。

2019BB1

2019BB2

2019BB3




Sinclair Scientific Calculator Emulatorキット

 tindleにてSinclairの関数電卓キットを見かけたので購入し、さっそく組み立てた。

プロジェクトの内容、組み立て方はこちら Sinclair Scientific Calculator Emulator(Arduino Enigma /hackaday.io)

 キット内容は基板とあらかじめ挿入してある7セグメントLED、タクトスイッチ、単4バッテリーケースに電池、プログラム書き込み済のArduino Nano、4.7kΩ×2、1kΩx8、スライドスイッチ、スペーサ、両面テープ。半田まで入ってた。さてこの写真には後にハマる落とし穴があります。なんでしょうか。
2018-ss1

 基板裏。写真の位置RKO/RKNに4.7kΩをハンダ付け。残りのR1〜R8は1kΩ。
2018ss2

 表側からはこのように見える。基板が白いのでフラックスクリーナーなどあったほうがよい。
2018ss3

 基板裏側からArduino Nanoをハンダ付け。ピンはこのように長い方をマイコン側にした。
2018ss4

 スイッチ類、LEDをハンダ付けしておわりと思いきや落とし穴にハマりましたよ。
あらかじめタクトスイッチは挿入してあるんですが、数字部分は青、その他は白のように分けてあるわけではないのです。たはーっ袋詰めの人はそこまでしてくれなかったか。ということでリワークの写真。
2018ss5

 動作確認自体は電池がなくてもArduino Nanoのmini-USBに給電することができます。あとはスペーサを取り付け、電池ホルダをキーの裏側に両面テープで貼り付けて完成。

 電源を入れるとSinClairの文字が表示され、使えるようになります。
2018ss6

セルフテストは0キーを押しながら電源ONで全LEDの点灯テスト、0と8のキーを押しながら電源ONでもうちょっと長いセルフテストを行います。

 このキット、内部はそのままSinclair Scientificをエミュレートしており、キーの接続も同じ様にしてある。
ソースリストはこちら。

 現代の電卓に慣れた身だと操作方法が直感的ではない。常に指数表示で[+]キーがエンターキーのような動作をするRPN方式、例えば1÷7は [1] [+] [7] [÷] となる。

 Sinclair Scientificのオリジナルには組み立てキットで提供されたものもあったようだ。


追記:コメント欄で教えてもらった。ナイトライダーK.I.T.T.のスキャナー。
IMGP2867

ちょっとキー入力のタイミングが難しくて、[0][8]のキーを押しながら電源投入、SINCLAIRの文字表示の直後、全LEDが点灯したらすぐキーを離し[2]のキーを押す。

Arduino: prog_char はなくなった

 あるソースをArduino IDE 1.8.1でコンパイルしたらエラーがでた。フラッシュメモリ上に定数を置くprog_charが使えなくなったとのこと。

prog_char error IDE 1.6.4

prog_char A[] PROGMEM = "... を
const char A[] PROGMEM = "... に書き換え。

中華レーザー彫刻機をレーザーカッターに変えるためのメモ

 40W CO2レーザーカッター、ベクトルデータを扱ってアクリルなどを任意形状にカットするにはどうしたらよいか。付属ソフトでの扱い方はよくわからないし、なによりWindowsXPで動作するのでそろそろなんとかしたい。持ち主であるminemaz氏と電話しながら色々検索したら、reprap系3Dプリンタのコントローラが使えそうなことがわかった。以下は議事録代わりのメモ。

 アップグレーキットというのは存在する。BeagleBoardBlackをベースにしたコントローラに載せ換える。ただし日本には送ってくれないみたい。
Lasersaur Shield K40 Laser USB Controller for Replacement of MoshiDraw Controller
UPGRADE LinuxCNC Controller CO2 LASER ENGRAVING CUTTING MACHINE ENGRAVER CUTTER(ebay)

 もうちょっと探してみるとArduino MEGA2540+RAMPS1.4というのがあった。このRAMPS1.4というのはreprap系3Dプリンタのコントローラで、さきほどのアップグレードキットにも使われていた。そうだよね、同じCNCだ。

Upgrade That Cheap-o Laser Cutter!(HACK A DAY)
40 Watt Chinese CO2 Laser Upgrade with RAMPS & Arudino(Adventures in DIY Engineers)
InkScapeのプラグインとして実行できるようだ。

OSOYOO 3D Printer Kit with RAMPS 1.4 Controller + Mega 2560 board + 5pcs A4988 Stepper Motor Driver with Heatsink + LCD 12864 Graphic Smart Display Controller with Adapter For Arduino RepRap(amazon.com)

 日本のアマゾンにもあった。

サインスマート RAMPS 1.4 3Dプリンターをはじめよう 互換キット(Mega 2560 R3 + A4988 for Arduino RepRap) 詳細なチュートリアルPDF提供

RAMPS 1.4 互換 コントローラ Controller Reprap 3Dプリンター
Kuman KY57 RAMPS 1.4 互換 コントローラ Controller Reprap 3Dプリンター 3Dプリンター基板セット+ヒートシンク


GY-302モジュールを使った簡単な照度計

 GY-302というモジュールを入手した。これにはロームのAmbient Light Sensor BH1750FVIで照度を測定しI2Cで読み出せる。

 照度計に関しては秋月電子から入手できる浜松ホトニクスのS9705を使ってなんとかしようと思っていたが、タイマ関連の設定をもっと厳密にする必要があって手を出せないでいた。
S9705照度計をスケッチのみで/Arduino 1.6.6のシリアルプロッタ

Arduino用のライブラリFlexTimer2では不正確な場合があり、以下の記事が参考になる。
FlexiTimer2の挙動の調査(Arduino)(ラジオペンチ)

 さて、GY-302モジュールならI2Cで読み取るだけということなので、簡単にできそうである。精度もセンサのばらつきにのみ左右される。ということでAmazon経由で購入。

GY-302 BH1750 光照度照明モジュール [並行輸入品]GY-302 BH1750 光照度照明モジュール [並行輸入品]

Phishine
売り上げランキング : 27339

Amazonで詳しく見る
by G-Tools

 BH1740FVI資料。Typ 3.0V動作、I2C。
http://rohmfs.rohm.com/en/products/databook/datasheet/ic/sensor/light/bh1750fvi-e.pdf

 GY-302モジュール資料。Vcc 5V入力をLDOで3.3Vに変換しBH1740FVIの電源にしている。SCL/SDAはプルアップ付き。I2Cのアドレスを設定するADDRはプルダウンされている。
BH1750 BH1750FVI Digital Light intensity Sensor Module For AVR Arduino 3V 5V

 ライブラリと作例も見つかった。ほぼそのまま使用する。
bh1750fvi (GY-302) Light Sensor Module(Simple Arduino Skeches)

 GY-302モジュールをそのままArduinoの端子に差し込んでみた。SCLをA5、SDAをA4になるようにさしてVccとGNDは無理やりワイヤで接続、ADDRはA3にささるのでピンの設定でGNDに落とした。

 スケッチはこちら。
https://gist.github.com/houmei/60255efe8029ca7a79e51a9c698a34ab

2016-GY302

 MacOSX10.10.5 / Arduino IDE 1.0.6にBH1750ライブラリを置く。ターゲットはDuemilanove w/ATmega328互換のCrowduino。秋月電子で扱っているデジタル照度計 LX-1010Bとだいたい同じ照度を表示することを確認。
 BH1750ライブラリ自体はArduino固有の操作をやっているわけではなく単にI2Cの送受信なので他のマイコンに持っていくのも簡単そう。

Arduinoで開発できるDigispark

 USB I/Fを持っていないはずのATTiny85をUSB経由で開発できるDigisparkという小型マイコンボードを試してみた。

開発元:Digistump Digistump wiki

 ファームウェアmicronucleusはソフトウェアでUSBデバイスを実現するV-USBを組み込んでいる。
https://github.com/micronucleus/micronucleus
V-USB

895円の超小型Ardunoクローン DigiSparkを買った(橋本商会)
Digisparkを買って動かすまで(syamojigzag)
安価なUSB直挿しマイコンDigisparkのススメ(Qiita)
Digisparkを試してみました(猫にコ・ン・バ・ン・ワ)
Digisparkの使い方(ELEFINE)

MacOSX 10.10.5 / Arduino IDE 1.6.9でやってみた。
メニューのArduinoから[Preferences...]を選択、追加のボードマネージャのURL欄に
http://digistump.com/package_digistump_index.json
を入れてOKを押す。
次にメニューのツールから[ボード:" xxx"]→[ボードマネージャ...]からDigistump AVR Boardsを探しインストールする。これらはArduinoにボードを追加する手順と同じ。

プログラムの転送はいったんMacからDigistumpを外した状態で[マイコンボードに書き込む]を実行し、60秒以内にDigistumpをUSBポートに接続する。

以下のプログラムはポート2に接続した焦電センサモジュールに感があるとLEDが点灯する。
https://gist.github.com/houmei/117544cfdc5a11e7163f9f2babdd8533

※訂正 ポート2です 写真は間違い
2016digispark-pir

 簡単にできた。USB-HIDなどの使用方法はインストールしたら追加されるスケッチの例を見ろ、とWikiに書いてあった。ATMega32U4(Arduino Leonardoなど)では大げさな、1ボタンで動作するキーボードなどに良さそう。

 以下の本、Kindleで買ってみたけど「Arduinoをはじめよう」のような内容でした。

Digispark USB Development Workshop (English Edition)Digispark USB Development Workshop (English Edition)
Agus Kurniawan

PE Press 2015-09-17
売り上げランキング :

Amazonで詳しく見る
by G-Tools

HiLetgo Digispark Kickstarter ATTINY85 Arduino Micro USB 開発ボード [並行輸入品]HiLetgo Digispark Kickstarter ATTINY85 Arduino Micro USB 開発ボード [並行輸入品]

HiLetgo
売り上げランキング : 90325

Amazonで詳しく見る
by G-Tools

Rasbee オリジナル Digispark Kickstarter ATTINY85 Arduino Micro USB 開発ボード Arduino 1個 [並行輸入品]Rasbee オリジナル Digispark Kickstarter ATTINY85 Arduino Micro USB 開発ボード Arduino 1個 [並行輸入品]

Rasbee
売り上げランキング : 55601

Amazonで詳しく見る
by G-Tools

Arduinoでログを取るメモ

 焦電センサモジュールの挙動があやしかったのでArduinoに繋いで終日ログを取ってみた。
やり方としてはArduino UNOの入力3本に焦電センサモジュールの出力をつなぎ、それを表示。センサの状態は16進数1桁で表すので、4ピンまではパッと見ただけでわかる。これを1秒ごと繰り返す。
1秒ごとシリアルコンソールに出力すると1秒ごとに選択がクリアされるのでコピペで結果を持っていけない。そこで60秒ぶん内部で溜めてから1分を一行として出力する。

ソースとログはこちら。
https://gist.github.com/houmei/e2e3f5a1cc5b09992a8df9c8eb429de1

焦電センサモジュールだが、ちゃんとした電源端子を使わずに内部3.3Vの箇所に乾電池を繋いだのが悪かったみたいで、きちんと仕様通りにやったらなんの問題もなかった。

SODIAL(R) モジュール焦電型赤外線検出器PIRモーションSODIAL(R) モジュール焦電型赤外線検出器PIRモーション

SODIAL(R)
売り上げランキング : 37055

Amazonで詳しく見る
by G-Tools
HiLetgo 人センサーモジュール焦電赤外線 HC-SR501 [並行輸入品]HiLetgo 人センサーモジュール焦電赤外線 HC-SR501 [並行輸入品]

Phishine
売り上げランキング : 24723

Amazonで詳しく見る
by G-Tools

Arduinoでスケッチのコンパイル時 undefined reference to `loop' などが出る場合の対処

 特にライブラリを作りながらスケッチも書いている場合、Arduino IDEでスケッチをコンパイルすると
undefined reference to `setup' や undefined reference to `loop' が出てエラーになることがある。どうやらスケッチをスケッチとして認識せずC++ソースとみなしてコンパイルしているような動作。

 以下は作業フォルダの例。

BYODというフォルダ以下に
BYOD.ino (Arduino IDEスケッチ)
BYOD.cpp (作成中のライブラリ)
BYOD.h (同上)

 このような構成のときにエラーがでる。スケッチのファイル名はフォルダ名と同じでなければならないので、次のようにリネームすると解決する。

BYODtestというフォルダ以下に
BYODtest.ino (Arduino IDEスケッチ)
BYOD.cpp (作成中のライブラリ)
BYOD.h (同上)

参考:
Arduino: undefined reference to `loop'



Arduinoをはじめよう 第3版 (Make:PROJECTS)Arduinoをはじめよう 第3版 (Make:PROJECTS)
Massimo Banzi Michael Shiloh 船田 巧

オライリージャパン 2015-11-28
売り上げランキング : 723

Amazonで詳しく見る
by G-Tools

Arduinoボードの識別方法

 ArduinoのUNOとLeonardoは性能的には似通っているが割り込みやタイマなど微妙に違う部分がある。それぞれのボードに対応したスケッチを分けずに書きたいなあと思っていた。

 以下の方法でボードを識別することができる。
Determine Arduino Board Model and Version Programmatically

Arduino UNO系では:
#if defined(__AVR_ATmega328P__)

Arduino Leonardo系では:
#if defined(__AVR_ATmega32U4__)

で判断することができる。Arduino IDEの1.0.6 / 1.6.7 / 1.7.8 で動作確認した。
これらはスケッチ内だけではなく、よりマイコンの内部構成に依存した書き方が必要なライブラリ内でも利用できる。

S9705照度計をスケッチのみで/Arduino 1.6.6のシリアルプロッタ

※参考linkを追加

 以前実験した、浜松ホトニクスのS9705による照度計。ライブラリに依存しているのでArduino Leonardoなどでは動かない。そこでPulseIn()を使ってスケッチだけで書き直した。

S9705 照度ー周波数変換フォトICを使った照度計

以下の部品を使った。
照度・周波数変換フォトIC 550nm S9705(2個入)(秋月電子)
1.27mm8ピンDIP変換基板(5枚入)(秋月電子)


S9705 接続: pin1(RST)=GND pin4(OUT)はArduinoのD5。あとは電源でpin2=GND,pin3=Vdd。

2015FreqLx2photo

スケッチは以下から:
https://gist.github.com/houmei/4347458b6f17de207670

これは単純にカウントするだけなので、精度を上げるためにはRST端子を制御してカウント開始をきちんと制御する等工夫が必要。


なおピン名をP1_5の様に変更するだけでMSP430 LaunchPad/Energia IDEでも動作した。

さて、Arduino 1.6.6ではシリアル出力をグラフにするシリアルプロッタが追加された。
Arduino IDEの新機能、シリアルプロッタが便利(Make:)

シリアル出力に数値のみを書き出すようにして、Arduino IDEのツールからSerial Plotterを選択する。

2015SerialPlotter

 こんな感じ。縦軸は自動的に変化する。

 今のところ単機能だけど、スペースなどで区切った数値で複数の折れ線が出たりしたら面白そうね。

参考:
Frequency counter using arduino(Circuits Today)
pulseIn(pin, value, timeout) (Arduino日本語リファレンス)



シリアルで適当音出力

 Arduinoで音を出すにはポートに圧電ブザーなんかを接続してtoneライブラリを使うのだが、ただ音が出るだけでよければシリアルポートの出力が使用できる。

 こんだけ。実際Arduinoかどうかは関係ない。
 void setup() {
  Serial1.begin(9600);
  while(!Serial1); // for Leonardo
}
void loop() {
  Serial1.write("3333333333");
  delay(1000);
  for (int i=1;i<10 ;i++) Serial1.write(0x55);
  delay(1000);
}
  0x55を出力すると、01010101 というビット列が出力される(より正確には前後に1bitずつ0が追加される)。文字列"33333333"は、"3"が0x00110011なので0x55の時とくらべて÷2の高さの音がでる。



 例えばRx側でGPSやら赤外線やらを受け取ってTx側が余っているときに警告音を出したい場合はライブラリも不要で簡単に実現できるということです。

Arduino Zero ProのシリアルはSerial5

 前回のTinyBASIC、Arduino Zero Proではうんともすんとも動かなかった。が、操作するハードウェアはシリアルポートだけなのでそこが違うのではないかと調べてみたら、ProgrammingPortからみえるシリアルポートはSerial5という名前だった。

Arduino Zeroボードの概要(内容説明)
Topic: Arduino Zero and the serial monitor (Read 141 times)

そこで、tinyBASIC.inoの先頭に

#define Serial Serial5

を追加。これで動作確認できた。が、キー入力を受け付けないことがある。本体をリセットしてもダメ。
切り分けのため、Serialに戻してArduino Zero Proのpin1、pin2経由で通信してみる。

2015zeroproserial


 つまりArduino Zero ProのUSBポートを迂回してみたのだが、問題なし。ということはUSB経由のシリアル通信に問題がありそう。

確認環境:
Arduino Zero Pro ProgrammingPortを使用

WIndows7(64bit)+Arduino IDE 1.7.2 TeraTerm → OKだがいったん接続を切るとダメ
MacOSX10.10+Arduino IDE 1.7.2 SerialTools → 入力を受け付けない いったん接続を切ると表示もダメ
MacOSX10.10+Arduino IDE 1.7.2 GNU screen → OKだがいったん接続を切るとダメ

ダメになったら、USBケーブルを繋ぎ直してもマイコンボードのリセットボタンを押しても元に戻らない。Arduino IDE 1.7.2で再度書き込みをするとポートがリセットされるのか接続できるようになることがある。(SerialToolsではダメ)

この間もずっとホスト(PC)側からは/dev/tty.usbmodemXXXとして見えているのだが……

こういった状況。なおUSB Native Portは未検証。WIndowsではUSB Native Port経由だと端末を接続した状態ではプログラム書き込みに失敗する。






Arduino Zero ProArduino Zero Pro

スイッチサイエンス
売り上げランキング : 110714

Amazonで詳しく見る
by G-Tools

Arduino Dueで豊四季タイニーBASICを動かす

 最近TINY BASICが流行っているようなのでちょっとやってみる。

 鈴木哲哉氏が開発したTINY BASICを使わせてもらいます。
命名-豊四季タイニーBASIC(電脳伝説 Vintagechips)

 以下からTTB_Arduino.zipをダウンロードする。
豊四季タイニーBASICのリファレンスを公開(電脳伝説 Vintagechips)

 開発環境はArduino IDE 1.7.2を使用。Arduino.orgの方からダウンロード。
New Arduino IDE 1.7.2

以下、動作環境はMacOSX 10.10 Arduino IDE 1.7.2

 まずはArduino Leonardoで動作確認。先ほどのTTB_Arduino.zipを展開し、Arduino IDE 1.7.2で展開したフォルダ内のTinyBASIC.inoを開く。
 マイコンとシリアルポートを指定し、書き込み。シリアル通信で確認。特に問題なし。

 次にArduino MEGA 2560を指定して動作確認。これもOK。

 さて、Arduino Zero Pro / Arduino Due だが、これらを指定してコンパイルすると以下のエラーが出た。

In file included from TinyBASIC.ino:23:0:
ttbasic.h: In function 'unsigned char* iexe()':
ttbasic.h:1107:36: error: cast from 'unsigned char*' to 'short int' loses precision [-fpermissive]
index = (short)lstk[lstki - 1];
^
ttbasic.h:1113:36: error: cast from 'unsigned char*' to 'short int' loses precision [-fpermissive]
vstep = (short)lstk[lstki - 2];
^
ttbasic.h:1116:34: error: cast from 'unsigned char*' to 'short int' loses precision [-fpermissive]
vto = (short)lstk[lstki - 3];
^

 該当する箇所(一部)はこのようになっている。indexはポインタなので、AVR系ではshortでもARM系では違う模様。
     index = *cip;
 ...
     index = (short)lstk[lstki - 1];

次の様に書き換えた。これでコンパイルしたらエラーなし。
     index = (uintptr_t)lstk[lstki - 1];

ついでにsetup()のシリアルポートを準備する所で
while(!Serial);
を追加した。

修正後のソース:
https://gist.github.com/houmei/a078fb52f5309846b3d2


 Arduino Dueで、マイコンをArduino Due(Programming Port)に指定して書き込み。動作OK。

 しかし、コンパイルと書き込みはできてもArduino Zero Proは何も応答しなかった。これはあとで。

 おまけ:複数のマイコンボードを接続して調べた今回は、このような電源スイッチ付のUSBハブが便利だった。
2015HUB





ELECOM USBハブ USB2.0対応 個別スイッチ付 バスパワー シール付 4ポート ブラック U2H-YS4BBKELECOM USBハブ USB2.0対応 個別スイッチ付 バスパワー シール付 4ポート ブラック U2H-YS4BBK

エレコム 2010-12-09
売り上げランキング : 10111

Amazonで詳しく見る
by G-Tools

Arduinoの分裂とIDE

 Arduinoの開発元がArduino LLCとArduino Srlに分裂し、それぞれからArduino IDEが出るようになった。
Arduino戦争:グループ分裂、そして新製品の登場(Make:Japan)

Arduino LLC http://arduino.cc/
 最新のArduino IDEは1.6.3
Arduino Srl http://arduino.org/
 最新のArduino IDEは1.7.0 (Java7が必要) Version 7 Update 75


 現在のArduino Zero ProはArduino Srlから出ている。Arduino LLC側はCOMING SOONとなっている。よって、Arduino IDE 1.7.0はArduino Zero Proをサポートしているが、Arduino IDE 1.6.3ではサポートしていない。
 Arduino IDE 1.7.0は名前に空白をふくむフォルダに入れて使っていると、Arduino Zero Proへの書き込み時に次のエラーが出る。(MacOSX 10.10で確認)

/Applications/Arduino Folder/Arduino1.7.0.app/Contents/Java/hardware/tools/gcc-arm-none-eabi-4.8.3-2014q1/bin/../lib/gcc/arm-none-eabi/4.8.3/../../../../arm-none-eabi/bin/ld: warning: section `.bss' type changed to PROGBITS

スケッチが プログラムストレージ領域の 10,764バイト (4%) を使用しています。最大は 262,144バイト です。
usage: dirname path
/Applications/Arduino Folder/Arduino1.7.0.app/Contents/Java/hardware/tools/OpenOCD-0.9.0-dev-arduino/bin/openocd: line 3: /Applications/Arduino: No such file or directory
 /Applications/Arduino Folder/ というサブフォルダを作って放り込んでいたのだが、これを/Applications/ArduinoFolder/ に修正したらエラーは出ず正常に転送できる。おそらく後から追加されたOpenOCD関連が対応していないと思われる。

 さて、Arduino LLCとArduino Srlから出る製品の違いでそれぞれのArduino IDEの対応状況も違ってくるのではという心配がある。Arduino LLCからはArduino TreArduino Zero が、Arduino SrlからはArduino Yun Mini、Leonardo ETHが出る予定となっている。これらによってArduino IDEを分けなければならないのはちょっと困る。

 Arduino UNOやLeonardoについてはArduino IDE 1.0.6で充分……なのだけどArduino SrlからはArduino IDE 1.0.6.2が出ている。これはArduino Srlから出ている9軸モーションシールドに合わせたライブラリと自前のシグネチャ、USBのVID/PIDに修正したもの。

 ということで、私自身の対応は
UNO/Leonardo系を使う時:Arduino IDE 1.0.6
Aruino Zero ProやDueを使う時:Arduino IDE 1.7.0の系列

にしようと思う。



Arduino Zero Pro
Arduino Zero Pro
スイッチサイエンス
売り上げランキング :


Amazonで詳しく見る
by G-Tools

メモ:Arduinoのtone()

 Arduino IDE 1.0.6 + Arduino Leonardo(互換機)で確認。
 昔はtoneライブラリだったのがいつのまにか内蔵のtone()関数になっていた。

http://arduino.cc/en/reference/tone

 昔はピンに制限があったような記憶。全ピンで音が出せるか以下のコードで確認。

https://gist.github.com/houmei/a81073dbe811d90c1fe4

圧電ブザーを端子に挿しながら確認する。D0〜D13、A0〜A5で音がでた。
tone(ピン,音程)でセットした後、noTone(ピン)で解除しないと別ピンでtone()が使えない。tone(ピン,音程,長さ)を設定したときも同様。

2015tonelib


次はこれを使ってみたい。

サインスマート(SainSmart) レオナルド 互換 Leonardo R3 ケーブル付 ブラック
サインスマート(SainSmart) レオナルド 互換 Leonardo R3 ケーブル付 ブラック
サインスマート(SainSmart)
売り上げランキング : 45127


Amazonで詳しく見る
by G-Tools

赤外線受信モジュールのばらつきと対策

 前回の実験の続き。今度はデータシートにあるノイズ対策をやってみた。ちょっと見てみよう。

2015IRtest1


 Vcc-GND間に電源安定用のコンデンサ、R2はダンピング抵抗と思われる。

ダンピング抵抗について:第6回 ダンピング抵抗の値ってどのように決めるの (elspear)

R1はプルアップ抵抗の様に見えるが
2015IRtest2

 赤外線受信モジュールの出力はこのようになっているので、内部のプルアップ抵抗にパラに22KΩをつないだようになる。赤外線受信モジュールのVcc-Vout間を測定すると25KΩ〜30KΩ台だったので、約10KΩくらいになる。V=IRなのでこの部分にノイズ源となる電流が流れるとRが大きいほどノイズとなるVも大きくなる。
デメリット:5V電源で内部30KΩとすると待機時に約0.17mA、10KΩになると0.5mA流れることになる。

コラム: インピーダンスの話(TRITECH)

こんな感じで対策回路を組み込んだ基板を作り、前回と同じ条件で実験した。
2015IRtest0



で、結果は以下のとおり。(クリックで拡大)
2015IR-receive


 対策後は認識率が上がっている。同じ種類のモジュール(秋月モールド、秋月シールド有り、ノーブランドシールド有り)それぞれ2個ずつ試したがモジュール間の差というよりは個別のばらつきが大きいように思える。そう言い切るためにはもっとたくさんの個数で調査しないといけないが手持ちはこれだけなので。
 ノイズ対策回路の効果は確認できたので、今回の用途ではその回路を組み込み、赤外線受信モジュールは選別品を使うことにする。

赤外線受信モジュールのばらつき

 赤外線リモコンの信号を受け取ることができる赤外線モジュール、試してみたら受信がうまくできるものとできないもの、ばらつきがあるように感じたので実験してみた。

 ソフトウェアはArduino用のライブラリを使用した。以下の記事を参照。ATmega32U4のArduino Leonardo系でも動く。
A Multi-Protocol Infrared Remote Library for the Arduino(Ken Shirriff's blog)

受信側環境:

MacOSX 10.10 Yosemite + Arduino IDE 1.0.6
IRrecvDemoのサンプルスケッチを使用。赤外線モジュールの信号はPin11に接続。
USB電源を本体から供給
Arduino Leonardo互換機 Seeeduino Lite

赤外線受信モジュール:
(1)赤外線リモコン受信モジュール PL-IRM2161-XD1(2個入)(秋月電子)
(2)赤外線リモコン受信モジュールOSRB38C9AA(2個入)(秋月電子)
(3)ノーブランド品
(4)GROVE - 赤外線受信器

2015IRmodule

送信側環境:
テレビ用リモコン ELPA RC-TV005ST サンヨー1241モード設定
約2m離れた距離から左手で[1]〜[12]キーを順に押す、これを10セット

室内蛍光灯を点灯した状態と消灯した状態で実験する。

リモコンのボタンを押すと対応したコードが4バイトの16進数で表示される。これを採取し、[1]〜[12]に対応するコードを正常、その他をエラーとして受信が成功する割合をだした。awkのスクリプトは以下。
https://gist.github.com/houmei/54843bfed64079e1aa92

さて、結果。-a,-bは二個同じ種類があったのでそれぞれ実験した。数値は蛍光灯下と蛍光灯を消した状態。

(1-a) 0.825175 0.726115
(1-b) 0.8125 0.77027
(2-a) 0.746575 0.538462
(2-b) 0.886364 0.789474
(3-a) 0.709924 0.754098
(3-b) 0.952381 0.902256
(4) 0.659574 0.588608

 6割を切っているものがある。"FFFFFFFF"のコードはキーが連続で押された状態。[1]〜[12]のキーを押した時には実際は連続しないのだが、これを弾くと:

(1-a) 0.991597 0.904762
(1-b) 0.983193 0.844444
(2-a) 0.908333 0.636364
(2-b) 0.991525 0.913043
(3-a) 0.781513 0.760331
(3-b) 0.991736 0.991736
(4) 0.853211 0.699248

なぜか蛍光灯を消した状態で成功率が下がっている。ひょっとしたらパソコンの液晶画面、つけっぱなしだったのでその影響か?
同じ種類でもばらつきがある。特に(2)と(3)はシールドされているタイプ。(4)は回路込みなのだが成功率が低い。

さてどうしようか。調べてみたら4.3 赤外線リモコン改善(その2)(電気電子工作の部屋)で、電源ラインにフィルタを入れたとある。今回の実験ではデータシートの推奨回路は使わず直結でやったので、次回やってみる。

GROVE - 赤外線受信器GROVE - 赤外線受信器

スイッチサイエンス
売り上げランキング : 138208

Amazonで詳しく見る
by G-Tools

メモ 赤外線受信

 Seeed StudioのGrove - Infrared Receiverの動作確認をした。動かしただけなのでメモ。

Grove - Infrared Receiver (Seeed Wiki)
ライブラリのソースはこちら。
https://github.com/Seeed-Studio/IRSendRev

サンプルのrevTestで動作確認。受光器に向けてリモコンのボタンを押すと数値がでる。

2015Ir


 以上はArduino Unoで確認したが、Arduino Leonardoではライブラリをコンパイルする時にエラーとなった。

 別のソースを試してみる。

赤外線通信の実験パート2(赤外線リモコンを送信機にして何か動かす)(きむ茶工房ガレージハウス)

こちらはスケッチのみなのでArduino Uno/Arduino Leonardoともに動いた。ただしたまに数値の受信が抜けることがあった。



ロータリーエンコーダ実験

 半年くらいまえにちょっとやってうまくいかず放置していたロータリーエンコーダの実験、うまくできたので整理。

環境:MacOSX 10.10 / Arduino IDE 1.0.6 / Seeeduino Lite(Arduino Leonardo互換)

ロータリーエンコーダはA相とB相の状態を見て回転方向を調べる。C端子はGND、AとBは10KΩでプルアップすることになっているが、ピンのプルアップ設定でよい。

2014rot1

コードは以下を参考に少し変えた。A相の変化で割り込みを使ってBの変化を読み方向を決める方式。
Leonardo系はpin2の割り込み番号がUNO系の0と違って1なので注意。

ロータリーエンコーダーを使ってみる(忘れないページ)
arduinoでロータリーエンコーダを使う (創ったり投げたり。)

https://gist.github.com/houmei/6524d5254652c7460a6e

私の環境では大量のテキストを連続してArduino IDEのシリアルモニタに送るとArduino IDEが応答なしになってしまう現象があった。なので、適当にdelay()を入れ、数値も変化した場合のみ送ることにした。
元のソースでは回転方向を'R'、'L'でいったん記録し、続くif文で++または--している。'R'を+1、'L'を-1にして続きでそのまま加算してやれば簡単になると思って改変したら'R'方向(ClockWise)の動きが渋くなってしまった。なんでプラス方向だけスッポ抜けることがあるのか不明だが調査保留とした。

追記:
Arduino IDE1.0.6の最新ファームを純正Arduino Leonardoに書き込んで実験→再現。Arduino UNOでも再現。

 さて以前やったときなぜうまくいかなかったか。ひとつはロータリーエンコーダの理解不足でカチカチと動かした時にA相B相の状態が固定になると思っていた。しかしクリックできる所で止まるとA,BともCとの接続はOFFになる。
 もうひとつはロータリーエンコーダによる端子配列の違い。

 これは上からC,B,Aの順。秋月電子のキットから流用したもの。
2014rot2

 これは上からB,C,Aの順。どこで買ったか忘れた。最近見かけるLED内蔵の透明な軸のタイプもこれ。
2014rot3

 これを間違って配線すると、片方向にしか回らないという現象が発生する。


記事検索
プロフィール

hardyboy

カテゴリ別アーカイブ
月別アーカイブ
QRコード
QRコード
  • ライブドアブログ