arduino用にsscanf関数のサブセットを作成

d161118a1C/C++のプログラムで簡単な文字列解釈が必要になった時、sscanf()で処理しているのだが、esp8266 arduino環境だと使えない。コンパイルは通るがリンク時にエラーとなる。仕方がないので strtol()関数などで凌いでいたのだが、浮動小数点の解釈をする必要があり、StringのtoFloatの説明を見ているうち、段々腹が立ってきて、sscanf()のサブセットを作ることを思いついた。

toFloat()で許せないのは、数字として解釈できなかった場合0を返すだけで、元の文字列を見ないと数字だったのかどうかわからないこと。解釈できたかどうかをbool値で返し、値は引数に変数のポインタを渡して返すべきだと思う。
続きを読む… »

SPI3台使いは、ちょっと大変

d161117a2HSES-LCD24ではESP8266(ESP-WROOM-02)のSPIに3つのデバイスが接続されている。TFT LCDとTouchscreenとSDカードスロットの3つだ。1つづつの動作確認は済んでいるのだが、今回初めて3つのデバイスを同時に動作させるプログラムを作ろうとしてトラブった。

各デバイスのライブラリーは、いろいろ提供されている。、SPI接続のライブラリーは基本的にSPIに複数のデバイスが接続されていることをあまり考慮していないので、使用の際には注意が必要だ。

まず、SPIデバイスのCS信号に接続されている端子は、初期化時にHighを出力されるようにされるが、そのまま初期化処理を続行されてしまうので、デバイスの初期化処理(biginメソッド?)を順次呼び出すと、他のデバイスのCS信号が未初期化、INPUTモードでハイインピーダンス状態でSCLK/MOSI/MISOに信号が出てくることになりMISO信号の衝突がありえる。よって、全部のCS信号を自分でHigh出力状態にしてやる必要がある。

続きを読む… »

esp8266/ArduinoのRTC

f161108a1ESP-WROOM-02等で使用するesp8266/Arduinoでは、サンプロプログラムにNTPClienttが含まれていることもあり、現在の時刻を取得するRTC(Real Time Clock)は自分で作成するものだと思い込んでいた。

時刻を取得するたびにntpパケットを飛ばすのもどうかと思うので、ntpパケットは適当な間隔で飛ばして、millis()関数とのオフセットでも管理することになるのかな。ntpサーバ1つだけだと嫌だな、とか色々考えているうち、偶然 esp8266/Arduinoの中にtime.cというファイルを発見。configTime()関数で、サーバーやタイムゾーン等を設定してやれば、time()関数でUNIX時間を取得できそう。
続きを読む… »

ILI9341のスクロール機能

fig161103a2ILI9341には,画面をスクロールさせる機能がある。VerticalScrollDifinition(33h)コマンドで、上下の非スクロールエリアの幅を設定(リセット時は0)。VerticalScrollStartAddress(37h)コマンドでスタート位置を設定すれば、Vertical Scroll Areaの表示を自由にスクロール(回転?)表示できる。

続きを読む… »

WiFiのSSIDをスキャン

161020a6ESP8266 ArduinoにWiFiのSSIDをスキャンする機能は、あるよね、と探してみたら、当然ながらあった。SCANクラスというものがあり、Arduinoの同名のライブラリを若干拡張してあるらしい。サンプルプログラムはWiFiScanというのがあって、何の問題もなく動く。結果はシリアルポートに出力される。

それだけでは、何なので、HSES-LCD24の液晶に結果を表示するようにしてみた。プログラムは、GitHubで公開している。 改造点は,表示順を信号強度順にソートしたぐらい。あとはひたすら、見た目が良くなるように調整した。液晶の解像度が320×240もあるので、凝ろうと思えば、かなり凝れる。

実用的な価値があるかどうかは別にして、ちょっとそれっぽい表示になったと思う。自宅で動かしても、かなり多くのSSIDが表示されることに驚く。ノイズが減るのか、深夜になると10を超えるSSIDが表示される。あと、別のESP8266と思われるSSIDが表示されている。これはセンサーを繋いで、WebClientとして動いているやつで、AccessPointとして動いているとは思わなかった。そのうち、調べてみたい。

161020a3

esp8266 ArduinoのPROGMEM

160903a0HSES-LCD24での日本語表示を試みる際に、PROGMEMを調べた。

ArduinoのPROGMEMとは、データをROM領域に格納する仕組み。(reference,日本語)

C(C++)言語だとconst修飾子を付ければ、十分な気がするが、AVR等の小型のCPUだと、そうはならない。命令用のROMとデータ用のRAMのアクセス経路を分離し、回路を節約しているためだ。ATmegaとかだとROMのデータを読み込むには、専用の機械語があった気がする。
続きを読む… »

ESP8266 Arduinoでmake

Arduinoのスケッチをmakeコマンドでコンパイルしたいという欲求は昔からあり、sudar/Arduino-Makefileなどというものがあるのも知っているのだが、ちょっと調べて

  • Linux前提っぽい
  • Makefileにincludeさせて使うものらしい
  • Arduino非純正CPU (ESP8266とか)に対応しているか不明

というような感じなので、手を出さずにいた。

HSES-LCD24で日本語の表示をさせようと検討すると、やっぱり fontxファイルをバイナリーのままコードに埋め込みたくなった。Arduino-IDEでコンパイルさせていると、埋め込み先のsectionがわからない。ということでgcc等のコマンドが見えるmakeコマンドでのコンパイルに挑戦してみることにした。
続きを読む… »

PIC32MXのSPI slaveの動作にハマる

PIC32MXでSPIのslaveモードを使用するプログラムを作成。ハマった。SPIは良く使うが、slaveモードを使うのは初めて。

プログラムを作成し、Arduinoでテスト信号を発生させ、動作させて見るも、まったく反応していない。何も受信していない感じ。CSとSCLKさえ動作すれば、MISOやMOSIが繋がっていなくても、なんらかのデータは受信するはずだ。試しに、masterモードにしてみるとsclkからクロックが出力されたので、設定は間違っていないはず..だが動かない。

散々なやんだあげく対応するANSELのビットをクリアしたら、動作を始めた。出力モードだとANSELは関係ないが、入力だと影響を受けるということか。なんか納得しがたいがそうなっているのなら仕方がない。動いたので解決だ。

博多に本を買いにいく

150823a7ふと思いついて、博多に本を買いに行く。OpenCVがらみで大きな本屋に行って、参考になりそうな本を探したいし、久しく大きな本屋に行っていないので、行きたい欲が高まっている。車のバッテリー電圧が低めとディーラーに言われているので、充電もできるかもと朝から車で博多のジュンク堂へ向かう。

8時頃出発し、天神の駐車場に車を置き、ジュンク堂に10時前に到着。地下1階のコンピュータ関連書籍のコーナーを見て回る。本棚が何列も並び、全体像を把握するのに時間がかかる。わざわざ来た甲斐があったというものだ。

気になる本は、いろいろあったが、結局2冊購入。
続きを読む… »

OpenCVのお勉強

今年の(大学ロボコン改め)学生ロボコンのテーマはバトミントン。熊大ロボコン部は2次ビデオ審査で落ちてしまったが、これからは画像認識技術も必須と煽っていたら、画像認識の勉強をしたいと言ってきた。そこで4月から週1回ペースでOpenCVなどの勉強会を開いてきた。

まずは開発環境の用意。Windowsのcygwin上に構築することにし、このページに従って準備をしてもらった。いつものことであるが、このような情報を公開していただいて、大変助かる。ありがたい。が、linuxやcygwinに不慣れなメンバーが環境を構築できるまでに数週を要した。
続きを読む… »

Tcl/Tk楽しい

sc15314-00相変わらずTcl/Tkの拡張とプログラミングをしている。楽しい。

Tkの文字を扱うtext widgetは高機能で,任意の領域の文字のフォント、サイズ、色などを設定できるし、文字以外に画像やウィジェットも入れることができる。但し内容をファイルにセーブしようとすると全部自分でやらなければいけない。その部分を作ったので、おお高機能!楽しい!となっているわけだ。Tcl/Tkで扱える画像はgifとpngだけだが自分で拡張もできる。そこでjpegも扱えるように拡張した。これで画像を好きに扱えるのではないかと思ったが、任意のサイズに変換する機能がない。整数倍に縮小する機能しかない。で、これも自作コマンドで拡張。画像ビューアーとか作れてしまいそうだ。
続きを読む… »

Tcl/Tkでプログラミング

sc1527-03WindowsのプログラムをTcl/Tkで作成している。Tcl/Tkの自前のコマンドを作成、トップレベルおよびUIをTcl/Tkで作成するという形。

このやり方で盛んにプログラムを作っていたのは、まだ前の会社にいたころで、前世紀。十数年前だ。

TeXとかTcl/Tkとか使っていると、何十年たっても変わんないじゃん、とか思うけど。詳しく見ればいろいろ変わっている。
続きを読む… »

JavaScriptの本を購入

bk140906c最近,JavaScriptに手を出している。ブラウザ上で動くアイデア・プロセッサ的なものを作りたいというのが動機。そのために、まずGoJS® のサブセットみたいなライブラリを作りたい。

JavaScriptは使ったことあるし、何とか使えるのだが、根本的なことを理解していないのではないかとか、今どきのやり方は違うのではないかというような不安が拭えないので、いろいろ本を買ってみた。
続きを読む… »

mips16導入

組み立た3代目ボード(右)と音出力ボード(左)

組み立た3代目ボード(右)と
音出力ボード(左)

先日届いた3代目LEDコントローラ基板を組み立て動作を確認した。さらにVS1011eで音声出力ボードを試作、いろいろ苦労しながらmp3ファイルを再生できるようになった。端子が足りないので、音出力時には、使えない機能がある。もう少し工夫すればそれもなんとか出来そうなので、考え中。

ところで、いろいろと機能を追加しているとプログラムサイズが、どんどん大きくなって行き、PIC32MX250の128Kbyteのプログラムメモリーをほぼ使い尽くしている感じ。まさか128KbyteものROMをプログラムだけで使い切るとは思っていなかった。今後、不要な機能を探して削っていくつもりだが、mips16命令セットを使用すれば、コード全体のサイズを減らせそうなのでこれも使ってみたい。 いろいろ調べてみると以下のことがわかった。
続きを読む… »

RSS表示装置のソフトウェア解説(2)

fig140713a1RSSの取得ができたので、表示するデータを抜き出す。RSSはXMLで記述され、多くの情報が含まれている。RSSの構造を図にしてみたものを右に示す。今回この中でジャンルとタイトルを表示に使用した。

そこでXMLを解釈しデータを抜き出さなければならない。いつもはPHPやPerlなどでXML Parserライブラリを使用するがstm32でphpやperlは動かないので使えない。探せばC言語用のライブラリもありそうだが、メモリー容量等の問題で使えるか怪しいので、今回は簡単なParserを自作した。
続きを読む… »