Arduino (17) TFT LCD2017年05月05日

1 年ぶりに電子工作を試みた。
GW の連休を利用して、新たな Arduino Shield をつくる。
今回は、タッチ・スクリーンがついた TFT 液晶ディスプレイをつないでみた。
いつものように、Adafruit の製品を参考にしたいのだが、そこに使われているのと同じパーツを手に入れることはできなかった。
幸いなことに、コントローラ・チップが同じで SPI 接続が可能なものが aitendo で見つかった (SX032QVGA008)。
TFT は 3.3V で動作するので、3.3V に改造した我が Duemilanove 1284p では、ピンとピンが直結できる (通常の 5V 版なら、電圧レベル変換のチップが必要になる)。
タッチ・スクリーンは、Adafruit のシールドではコントローラ・チップを使われているが、入手できなかったので、そのままアナログ入力につないで、ソフトウェア制御する予定だ。
micro SD I/F を組み込んで、ハードウェアは 1 日 (半日 x 2) ほどで完成した (ボードの加工に思いのほか時間を要した)。

Shield-5

TFT への表示は、Adafruit のライブラリ (Adafruit_ILI9341) とスケッチ (graphicstest) がほとんどそのまま使える (ピンの割り当てを変更したくらいだ)。

graphicstest

以前つくった「漢字表示テスト」のスケッチを実行してみる。

漢字表示テスト

ピンの割り当てをこれまで作ったシールドと共通にしているので、ライブラリを差し替えるだけで、そのまま動く (フォントを micro SD から読み込むようにしているので、micro SD I/F の動作確認にもなる)。
以前の LCD に比べると、縦横が 2 倍になっているので、文字列がすべて表示されるようになった。
タッチ・スクリーンについては、タッチ位置を analogRead() でトレースできることを確認した (Serial モニタ表示)。
GUI とタッチ・スクリーンによる制御を行うためには、xy 座標への変換 (キャリブレーション) が必要だ。
また迷い道に踏み込んでしまったようだ。

Arduino IDE / Eclipse ARM, AVR2017年01月09日

Eclipse AVR で Arduino の環境を設定したときに生じた問題 (warning の解決) を記録に残すことにした。

去年の年末、HDD の換装と OS (Linux) のアップグレードを行った。
HDD で retry エラーが頻発していたためで、SDD に換装し、Linux Mint 18.1 をインストールした。
データのみバックアップしたので、ツール類 (Arduino, Eclipse) は、最初から設定することになった。

o Arduino IDE

バージョンが 1.8.0 になったが、インストールには問題がない。
Preferences で Duemilanove 1284p の設定ファイル (package_atmega1284p-1.0.0_index.json) を指定し、Boards Manager から Duemilanove 1284p を選択すれば、Duemilanove 1284p が使えるようになる。

o Eclipse + ARM plugin

前回 (2015/08/02 STM32 Nucleo STM32F072) 同様の手順 (GNU ARM Eclipse (http://gnuarmeclipse.livius.net/blog/)) の通りで、特に問題なくインストール/設定ができた。

o Eclipse + AVR plugin

これまでとは異なり、

https://www.codeproject.com/Articles/1003347/Creating-Arduino-programs-in-Eclipse

の手順にしたがってインストールした。
これで一応動作するのだが、Warning が消えない。

ignoring old commands for target `arduino/wiring_pulse.o' subdir.mk /Blink/Release/arduino line 251 C/C++ Problem
overriding commands for target `arduino/wiring_pulse.o' subdir.mk /Blink/Release/arduino line 258 C/C++ Problem

Eclipse AVR Warning

調べてみると、Build Project で自動生成される arduino/subdir.mk (Makefile) の中に target の arduino/wiring_pulse.o が 2 つあることがわかる。
wiring_pulse.S と wiring_pulse.c が同じ wiring_pulse.o を生成するような記述になっているのだ。
このままでは、後から記述された wiring_pulse.c だけが使用されて wiring_pulse.S は使用されない。
wiring_pulse.c で定義される関数 pulseIn() を使わなければ、エラーにはならないし、動作もするだろう。
しかし、それでは、pulseIn() を使いたくなったときに困ることになる。

Arduino IDE の場合は、どうなっているのだろう。
コンパイル・ログを調べると、Compiling core... の部分で、
wiring_pulse.S と wiring_pulse.c は、それぞれ wiring_pulse.S.o, wiring_pulse.c.o を生成するよになっていて、上記のような warning は発生しない。

"~/arduino-1.8.0/hardware/tools/avr/bin/avr-gcc" -c -g -x assembler-with-cpp -mmcu=atmega1284p -DF_CPU=16000000L -DARDUINO=10800 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I~/arduino-1.8.0/hardware/arduino/avr/cores/arduino" "-I~/.arduino15/packages/Arduino AVR Board/hardware/avr/1.0.0/variants/standard" "~/arduino-1.8.0/hardware/arduino/avr/cores/arduino/wiring_pulse.S" -o "/tmp/arduino_build_106259/core/wiring_pulse.S.o"

"~/arduino-1.8.0/hardware/tools/avr/bin/avr-gcc" -c -g -Os -w -ffunction-sections -fdata-sections -MMD -mmcu=atmega1284p -DF_CPU=16000000L -DARDUINO=10800 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR   "-I~/arduino-1.8.0/hardware/arduino/avr/cores/arduino" "-I~/.arduino15/packages/Arduino AVR Board/hardware/avr/1.0.0/variants/standard" "~/arduino-1.8.0/hardware/arduino/avr/cores/arduino/wiring.c" -o "/tmp/arduino_build_106259/core/wiring.c.o"

Arduino IDE は、独立したツール (環境) なので、Eclipse AVR のような別の環境に組み込まれて使われることは想定していないし、一方の Eclipce AVR は Arduino IDE のように独立した環境の一部を参照するような使い方は想定されていないだろう。
Arduino IDE と Eclipse AVR の両方を使いたいので、これらツール自体に変更を加えることはできない。
そこで、wiring_pulse.S を wiring_pulse_S.S などとリネームして回避することにする。
Arduino IDE では wiring_pulse_S.S.o が生成され、Eclipse AVR では wiring_pulse_S.o が生成されるので、いずれの環境でもエラーは発生しない。
今後は、Arduino IDE がアップグレードされるたびに wiring_pulse.S のリネームが必要になるが、Eclipse で Arduino の開発が行えるというメリットは大きい。

Solo Learn2016年09月18日

このところ、通勤途中の電車の中で、Solo Learn なるアプリでプログラミング言語を学んでいる。
Solo Learn という名前の通り、自習を目的としたものだ。
Java や C, C++ をはじめ、いくつかのコースが用意されているが、私は Python のコースを選択した。
何を今さらと言われそうだが、特に理由はない (いつもの通りの回り道/迷い道なのだ)。
構成は、概念と文法の説明に続いて example, 演習問題となっていて、一般的な解説書や自習書 (tutorial) と同じだ。
これによってすべてを学べるわけではないが、最初の一歩としては十分な内容だ。
コースはすべて英語で書かれているが、記述はとてもわかりやすい。
進捗に応じて経験値 (XP) が上がる。
Leader Board を見れば、コースに参加している人たちの中で、自分が今何番目にいるか知ることができる。
コースを終了すると、修了証明書 (certificate) (画像) がもらえる。

ところで、世界中でどれくらいの人が参加しているのだろう。
何万人だろうか、何十万人だろうか。
いずれにしても、自分と同じように学んでいる人たちが、世界中にいる。
スマホの窓はとても小さいけれど、その窓はいつでも世界に向かって開かれているのだ。
Solo Learn は、決してひとり (solo) で学ぶことではない。
ほかのコースにもチャレンジしてみたいと思った。

Arduino (17) Board Manager2016年05月07日

Arduino IDE のバージョンが 1.6.8 になっても、我が Duemilanove 1284p を追加した環境 (sketchbook/hardware) は、そのまま使えるようだ。
しかしながら、コンパイル時に warning が出るようになった。

Warning: platform.txt from core 'Arduino ATmega1284p Boards' contains deprecated compiler.path={runtime.ide.path}/hardware/tools/avr/bin/, automatically converted to compiler.path={runtime.tools.avr-gcc.path}/bin/. Consider upgrading this core.
Warning: platform.txt from core 'Arduino ATmega1284p Boards' contains deprecated tools.avrdude.cmd.path={runtime.ide.path}/hardware/tools/avr/bin/avrdude, automatically converted to tools.avrdude.cmd.path={path}/bin/avrdude. Consider upgrading this core.
Warning: platform.txt from core 'Arduino ATmega1284p Boards' contains deprecated tools.avrdude.config.path={runtime.ide.path}/hardware/tools/avr/etc/avrdude.conf, automatically converted to tools.avrdude.config.path={path}/etc/avrdude.conf. Consider upgrading this core.
Warning: platform.txt from core 'Arduino ATmega1284p Boards' contains deprecated recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{build.path}/{archive_file}" "{object_file}", automatically converted to recipe.ar.pattern="{compiler.path}{compiler.ar.cmd}" {compiler.ar.flags} {compiler.ar.extra_flags} "{archive_file_path}" "{object_file}". Consider upgrading this core.

Warning に示されているように、platform.txt の各パラメータを修正すればよいのだが、ver.1.6.x への対応方法が

https://github.com/arduino/Arduino/wiki/Arduino-Hardware-Cores-migration-guide-from-1.0-to-1.6

に記載されているので、手順にしたがって、フォルダの構成、board.txt, platform.txt を修正する。

せっかくなので、Boards Manager にも対応させる。
製品ではないし、ほかにはないのだから、そのままの環境で使っていてもいいのだが、標準から離れてガラパゴス化してしまうのもつまらないだろう。
いろいろと調べてみると、ボードごとの package ファイルとそれら情報をまとめたテキスト・ファイル (JSON フォーマット) を用意する必要がある (package_atmega1284p-1.0.0_index.json)。

https://github.com/arduino/Arduino/wiki/Arduino-IDE-1.6.x-package_index.json-format-specification

にしたがって作成する。
example があるので、それを元に編集すれば簡単だ。
package ファイルは、これまで使っていた Duemilanove 1284p 用のフォルダ sketchbook/hardware/ATmega1284p から再構築すれば良さそうだ。
出来上がったフォルダ/ファイル一式を archive にまとめ (package_atmega1284p-1.0.0.zip)、checksum を計算する (sha256sum)。

sketchbook/hardware を削除し、Arduino IDE を再起動して、Pro Micro のときと同様の手順で Duemilanove 1284p を追加する。
Boards Manager のファイル (package_atmega1284p-1.0.0_index.json) を URL で設定 (追加) し、

Arduino Boards Manager URLs

package をインストール、

Arduino Boards Manager (2)

board と port を選択して、

Arduino IDE Tools (2)

これまでと同じように Duemilanove 1284p が使えるようになった。

Arduino (16) Pro Micro2016年05月07日

まとまった時間が取れず、ずっと電子工作から遠ざかっていたのだが、久しぶりに秋葉原に出かける機会があり、また工作の虫が目を覚ましたようだ。
aitendo に立ち寄ると、(Arduino) Pro Micro の互換ボードを見つけたので買ってしまったのだ。

Arduino Pro Micro

使うためには、Arduino IDE に認識させる必要がある。
しばらくの間 Arduino も放ったらかしにしていたので、IDE のバージョンが 1.6.8 に上がっていることも知らなかった。
アップグレードするとともに、Pro Micro にも対応させようと思う。
オリジナルの Pro Micro の Producer である SparkFun のサイトで情報を集めると、Boards Manager を使って登録するようだ。
File -> Preferences で Settings タブの Additional Boards Manager URLs: に SparkFun の URL を設定してやればよい。

https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json

Arduino IDE Preferences

次に、Tool -> Board から Boards Manager... を起動し、Type Contributed で表示される SparkFun AVR Boards をクリック、Install ボタンでインストールする。

Arduino Boards Manager (1)
 
最後に、Tool -> Board の pull down リストから SparkFun Pro Micro を選択し、Processor は ATmega32U4 (5V, 16MHz)、Serial Port は /dev/ttyACM0 を選択すれば、使えるようになる。

Arduino IDE Tools (1)

SparkFun の Tutorial から Blinkies! の example を使って動作を確認する。
Rx/Tx の LED が交互に点滅すれば、O.K. だ。

Processor の選択に示したように、(互換) Pro Micro は 5V, 16MHz で動作するようになっている。
毎度のことながら、3.3V で動作するように改造する。
Duemilanove のときは、パターンをカットしたり、ジャンパを配線したり、少しばかり手間がかかったが、今回は、レギュレータ IC (MIC5219) を 3.3V 用に交換するだけで済んでしまう (ボードの選択は、5V, 16MHz のままでなければならない)。
3.3V, 16MHz の動作は保証されていないが、これまでのところ問題なく動作しているようだ。

# 実は、さらに小さい USB micro のモジュールもあったのだが、改造作業のしやすさを考えてでこちらを選んでいる。