まごころせいじつ堂

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

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直結ROMリーダーのトラブル

※追記 27512(64Kバイト)まで対応のソフトができました → readROM27512.ino Intel HEX対応


 ROMライタTL866CSでは読めないマスクROM(TMM2364P)があったので、Arduino MEGA用のアダプタを作った。秋月電子の片面D基板、ピンヘッダははみ出るので少しけずっている。
IMGP3589

 Vcc-GND間に3.3μFの電解コンデンサと0.1μFのセラミックコンデンサ。
IMGP3590


 ROMの端子とArduino MEGAのピン番号の対応は以下のとおり。27512の場合はROM(1)がA15、ROM(27)がA14、ROM(26)がA13。
あとpin52にタクトスイッチを繋いでGNDに落としている。これはPROMダンプ開始用。
readROM


 さて、こんな単純な配線なのにArduinoスケッチを書いて読み込んでみるとデータが化ける。なぜだ。
IMGP3588

データの読み込みが不安定な時点で以前の経験を思い出すべきだった。
ここでやるべきだったのはアドレスと制御線の見直し、ソフトでの初期化だった。


 解決までの顛末は以下のスレッドにある。

 さて、解決までには間違った道をどんどん進んでいっているのだが以下に整理しておく。

・ハードウェアの絞り込み
PROMの2764/マスクROMのTMM2364P/W27C512で読み込み時のデータ化けが発生する。W27C512に特定のパターンを書き込んだものを調査対象とする。

・Arduino MEGA 2560のバリエーションによるものかどうか
互換品を3つ持っていたのでそれぞれで確認。どれも同様に発生するのでArduino MEGA個別についてまわる問題ではない。1枚を選んで調査対象とする。

・類似例の調査
どこかのだれかが同じようなことをしていないか検索。あった。
これによるとほぼ同等のハードウェア構成で成功している。ブレッドボード上にPROMを載せてジャンパ線でArduino MEGAに繋いでいるので電気的にはより条件が悪いはずだが動いている。

・土台の確認
上記、The Oddbloke geek Blogのコードをこちらのボード向けにピンアサインを変更し、ダンプを5回実行して結果を比較。5回とも問題なし。

ここまででソフトウェアの違いに問題点が隠されているとわかった。前後してデータ化けの発生率が変わるようなコードの変更(主に時間的なタイミング)をいじっては観測を繰り返している。挿入するディレイによって化け方の頻度が変わるなど、ハードウェアのピンが浮いているような指摘を受けている。

・知恵を借りる
デバッグの状況は適時tweetしていた。こまめに書くことで気付くこともあるし、識者からのツッコミもある。このあたりで泥沼にハマっていたら@mkogaxさんよりコードの初期化漏れの指摘が。
PROMのA15についてArduino MEGAからの出力設定はされていても値が設定されていなかった。この状態で確認したらA15はオープンだった。修正し、ダンプを10回とって比較したら全部OK。

以下は23行目に初期化の抜けがあるコード。


 ということで思考の過程を整理してみました。動物が沼にはまってもがいている様子がわかると思います。突っ込んでくれた皆さんどうもありがとうございました。

 ちゃんとしたPROM読みのコードは次回。



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

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

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

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

2019BB1

2019BB2

2019BB3




秋月のLCD用ケースにぴったりはまる7セグLED

 秋月電子で扱っているプラスチックケースSW-125S(LCD)にぴったりはまる4桁の7セグメントLEDがある。

 いやそれだけなんですがこの7セグLEDについては過去調べたことがあって、ひとまわり小さい7セグLEDとピン配置が同じなのです。

7segment
 で、このLEDを使用している@morecat_labさんの7segduinoというのがあって、ほぼそのままで差し替えることが可能です。

7segduino(スイッチサイエンス)

 キットを組み立てた後で7セグLEDの端子をこのように曲げてはんだ付けし、ケースにはめてエポキシ系接着剤で固定。
2018-7seg1

 シリアル通信にはFTDI USBシリアル変換アダプター Rev.2(スイッチサイエンス)を使用。接続すると以下の様に表示。一定間隔で表示が左方向に流れます。
2018-7seg2

 これはキット付属の7セグメントLEDがアノードコモンにたいし差し替えた大型のLEDがカソードコモンのため。そこでライブラリの一部をカソードコモン用に書き換えます。

動作確認:Windows10(64bit),Arduino1.8.8

以下のページからSSegライブラリをダウンロードしArduinoのライブラリに追加。
SSegフォルダ内のSseg.cppについて、
_kcommon = 0 ;
_kcommon = 1 ;
に書き換え(三ヶ所)。
examplesにあるcount_7seg.pdeで動作確認。
2018-7seg3

 カウントアップしていきます。いい感じですね。USB電力計で簡単に確認したところ、電流は0.04~0.07Aでした。

 次はこれになんか組み込みます。

4ICs Z80ボード(1) ATMega32LのArduinoブートローダ書き込み

 もあ(@morecat_lab)さんに4ICs Z80ボードを譲っていただきました。ありがとうございます。

手持ちの部品があったのでとりあえずすべて実装。10cm×10cmのサイズ。
2018-ATMEGA32-ALL

 このボードは40pinのAVRがすべてを制御してZ80を動かすしくみなので、AVR ATmega32Lにソフトウェアを書き込んでやらないといけません。まずはArduinoのブートローダーから。

 AVRISPmkIIで書き込めるようにICSP端子を空きエリアに用意。
2018-ATMEGA32-ISP-CONN

 ATMega32Lの pin6 - MOSI , pin7-MISO , pin8 - SCK , pin9 - *RESET
2018-ATMEGA32-ISP-CONN2

参考:
ATmega DIP40 in Arduino IDE 1.6.4
Burning Arduino Bootloader to Atmega 32A-PU Using Arduino As ISP

ハードは以上。次はソフト。Windows10からAVRISPmkIIを使うには若干の手順が必要らしい。
windows10でAVRISP MKIIを使う方法 @yoshihiroo

 まずドライバをインストールし、AVRISPmkIIをPCに接続。次にlibusb-win32-devel-filter-1.2.6.0.exeをインストールする。ここでデバイス一覧が出るのでAVRISPmkIIの箇所を選択して完了する。
libusb-win32というのはどうも署名などをうまくバイパスするような仕組みみたい。

 以上の方法はどうしてもAVRISPmkIIを使いたい時の方法で、Arduino UNOが手持ちにあれば Arduino as ISP で書き込んだほうが楽。

 さて書き込み器の準備はできたので、Arduino IDEに40pin AVRのライブラリを設定する。ライブラリは複数あったのだが以下のMightyCoreを使ってみた。
MightyCore : An Arduino core for the ATmega16, ATmega32, ATmega324 and more…

 Windows10上でArduino IDE 1.8.4を起動し、[ファイル]→[環境設定]をクリック、追加のボードマネージャのURL欄に
https://mcudude.github.io/MightyCore/package_MCUdude_MightyCore_index.json
を書いて[OK]で終了。
 次に[ツール]→[ボード]→「ボードマネージャ…」をクリック。ここからMightyCore by MCUdude バージョン1.0.8をクリックしてインストールする。
 インストール後
[ツール]→[ボード]をクリックするとMightyCore以下にATmega1284など40ピンのAVRが追加されている。ATmega32をクリックしてボード"ATmega32"を選択すれば、次に[ツール]→[ボード]をクリックしたときに項目が追加されている。この4ICs Z80ボードには水晶発振子がないので Clock 8MHz Internalを選択。

 以上で準備ができたので[ツール]→[ブートローダを書き込む]をクリック。これでATmega32LがArduinoになった。なお実際の書き込み前にZ80やSRAMは誤動作を防ぐため外しておきます。
2018-ATMEGA32-ISP-Write


 動作確認のため、基板上のシリアルポートにUSB-シリアル変換器を接続して"Blink"のスケッチをシリアルポート経由で書き込んでみる。基板上のD0 LEDが点滅すればOK。
2018-ATMEGA32-ISP-OK


 ここまでが準備でした。
 なお40pin AVRのライブラリやClock 8MHz Internalの設定は今後変わるかもしれませんがまずは動作確認ということで つづく。

ArduinoでGPSから時刻データを取得する

 Amazonで安いGPSモジュールがあったのでArduinoに接続して時刻データを読んでみた。

Rasbee GY-NEO6MV2 Flight コントローラー NEO-6M APM 2.5 GPSモジュール Arduino用 1個 [並行輸入品]Rasbee GY-NEO6MV2 Flight コントローラー NEO-6M APM 2.5 GPSモジュール Arduino用 1個 [並行輸入品]

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

Amazonで詳しく見る
by G-Tools

 このGPSモジュール、基板上にはGY-GPS6MV2と書いてある。主要なモジュールはblox NEO-6M、コイン電池とEEPROM、GPSアンテナ用コネクタが付いている。電源は3.3V、シリアル9600bpsで通信。衛星からの電波を安定して受信しているときは青色LEDが点滅する。

データシート:
NEO-6 u-blox 6 GPS Modules(PDF)
Hardware Inegration Manual(PDF)
u-blox 6 Receiver Description Including Protocol Specification(PDF)

 NEO-6Mはシリアル接続の他にUSBでパソコンに直結できるらしいのだがこのモジュールにはそれらしき引き出しパターンなどはない。時刻取得程度だと特に設定もなく、モジュールのRXとマイコンのTXは接続しなくてもよさそう。

2017GPS1


作例:
GY-GPS6MV2 – NEO6MV2 (Neo 6M) GPS Module with Arduino / USB TTL
(WEBSITE AND BLOG OF AYOMA WIJETHUNGA)
GY-GPS6MV2をArduinoでテスト(woosan900rrの日記)

 マイコンはArduino Leonardo互換のSeeeduino Liteを使用した。5V/3.3Vの切り替えができて便利。モジュールとの接続は電源を3.3V、GND、モジュールのTXとArduinoのRX(D0)を接続する。

 さて、GPSからのデータはNMEAフォーマットというカンマで区切られたテキストデータで取得できる。
NMEA 0183 フォーマット
このうち、GGAメッセージ(第1フィールドが$GPGGA)の行の第2フィールドが時刻データ(UTC)である。第14フィールドは補正時間らしいのだが今回は無視した。チエックサムも無視している。

スケッチはこちら:
https://gist.github.com/houmei/8fbc1e223611258204b071745722b071


 ちょっとがんばってSerial.readStringUntil('\n')を使ってみた。一文字ずつ受信して処理するのは大変なのでStringクラスで全部やった。ついでに今後のためにString.toInt()で整数に変換して時刻もJSTに補正した。
こちらが参考になった:【prog】Arduino・シリアルで文字列受信するには(ゆうがたの特にコレと言って)

 今後は座標やその他の情報が取得できるようカンマ区切りでデータを読み取るようにしたい。以下はそのためのメモ。
文字列を区切り文字で分割するsplit()関数 for Arduino(山形大学工学部ロボタスティクス)
Arduinoにつないだセンサからの値をパソコンで記録する(6)(Ukkari blog)


Seeeduino LiteSeeeduino Lite

Seeed Studio
売り上げランキング :

Amazonで詳しく見る
by G-Tools

アナログ入力1本でマトリックスキーを扱う

 アナログ入力によるロータリーエンコーダの読み出しとちょっと関係あり。今回はマトリックスキーを扱ってみた。

 12Key マトリクスキーボード JK-42-2(共立エレショップ) のような3×4のテンキー、中はマトリックス配線になっている。スイッチが個別に扱えれば抵抗分圧式で可能だが、解体して配線し直すわけにもいかない。
抵抗分圧式の例:I/Oピン一つで読み取れるキーパッドの製作(しなぷすのハード製作記)

 ではどうしようか。横方向で分圧したあと、縦方向でさらにその範囲内で分圧すればよさそうだ。

ankey_2017-04-11 00_37_52

 実際はこんな感じで配線。
ankey_2017-04-11 00_39_34

 Arduinoのスケッチはこんな感じ。雑なコードですまん。
https://gist.github.com/houmei/7c42c60a56e6f63c08467aaa3296722b

 同時押しすると別のキーになってしまうことがある。(追記:ADC入力値の範囲を絞ることで若干改善)うまく抵抗値を選ばないといけないかも。計算したExcelのシートをどっかになくしてしまった。

2017ankey1

2017ankey2

2017ankey3

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 = "... に書き換え。

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

7セグメント用H68/TRフォントデータ

 最近作っているのは7セグメントLEDを使った電卓シールドなのだが、せっかくなら16進数も扱いたいし、できればアルファベットも表示したい。

 で、最近見かけたのはこのフォントデータ。
7セグ・14セグフォント 「DSEG」(keshikan.net)

 だが、私の知っているものとは少し違う。こっちのほうです。
Hitachi H68/TR(IC Collection)

 H68/TRは電卓風のコンソールに7セグメントのEL管が入っていて無理やりアルファベットを表示していた記憶。では具体的にはどのような表示だったかというと、以下にありました。
トイレのドアを修理 H68/TR落札したかったな(今日を生きた証)
 こちらのマニュアルの写真を参考に、64文字分の7セグメント用データを作成。

 データ部分は以下をご利用ください。
https://gist.github.com/houmei/50bd6e7c56b60480f6e7

2016h68trfont

 ちょっとハマった所があって、配列の初期化のうち1要素がなぜか抜けるような動きをした。バックスラッシュの字体を定義するところを
  0x06, // B00000110, // \
としたら継続行とみなされ次の要素がコメントアウトされた。
  0x06, // B00000110, // "\"
でOK。
C 言語の「//」コメントは、バックスラッシュで継続行になる!(私の二次記憶)



マイコンと表示器をつなぐ10の方法 (マイコン活用シリーズ)マイコンと表示器をつなぐ10の方法 (マイコン活用シリーズ)
後田 敏 中西 一雄 世古 伸治 長田 直之

CQ出版 2006-05
売り上げランキング : 607010

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側が余っているときに警告音を出したい場合はライブラリも不要で簡単に実現できるということです。

I2C EEPROM実験基板

 秋月C基板の半分サイズのD基板をさらに半分に切ってI2C EEPROMの実験基板を作った。24LC256や24LC64などをテストできる。

 端子は左からSCL,SDA,Vcc,GND。Groveの並びに合わせてある。I2Cバスのプルアップ有無とアドレスの指定が可能。ライトプロテクトはなし。
2015I2CEEPROM1

2015I2CEEPROM2



 ArduinoのI2C Scannerで動作テスト。i2c_scanner(Arduino playground)
24LC256を使ってアドレスのジャンパ線を設定することにより、0x50〜0x57に変化することを確認。

 テストは熾火研究所*電子工作室さんのブレッドボードシールドを作ってやってみた。これ便利よ。
もういっそのこと… で、『ブレッドボードシールド作ってみた』(熾火研究所*電子工作室)

2015breadboard1


2015breadboard2


 読み書きテストはまだ。

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

記事検索
プロフィール

hardyboy

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