2017年11月19日

Raspberry Pi Zeroにカラーのピンヘッダを装着

rpi-color-gpio.jpg

これまでRaspberry Piを電子工作的には使ってこなかったこともあり、RPi Zero WのGPIOにはピンヘッダをつけていなかったのですが、ベアメタルの実験用にピンヘッダをつけました。

ピンの機能が色分けされた製品があったので、それを使ってみました。
英国で電子工作関連のグッズをいろいろ売っているPimoroniの製品です。

Colour-coded GPIO Header for Pi Zero - Pimoroni

国内では千石電商で買えます。200円でした。

COM1111 Colour-coded GPIO Header for Pi Zero

この色分けの意味ですが、5Vが赤、3.3Vが黄色、GNDが黒です。
rpi-gpio.png


ここまではいいのですが、水色のピンがあって、これは「何も繋ぐな」(Do Not Connect)となっています。
わざわざピンを引き出しておいて、繋ぐなとはどういうことでしょう。
回路図を見ると、この2本のピンの用途が書いてありました。
rpi-gpio-idsc-idsd.png

このピン(ID_SD、ID_SC)は、Raspberry Piに接続するボード(HAT)上のEEPROMを接続するための端子だそうです。
信号的にはI2Cですが、ブート時にここからEEPROMを読み取って、それにあわせたGPIO設定をするためのものなので、それ以外の目的に使ってはいけない、ということです。

この信号の使い方については、Raspberry Piのブログに記載があり、仕様もGitHubで公開されています。

Introducing Raspberry Pi HATs - Raspberry Pi

raspberrypi/hats

posted by boochow at 19:38| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

Raspberry Pi2でベアメタルプログラミング環境を作成

rpi-baremetal1.jpg

先日ちょっと調べたRaspberry Piのベアメタルプログラミングですが、やはり調べたら試してみたくなるもので、Interface誌2017年2月号の記事の通りにやってみました。

ちょっと試すだけならQIピンでの接続でもいいのですが、UARTとJTAGをつなぐとなると結構な本数になりますので、接続用の基板を作成することにしました。
上の写真のように、Raspberry PiのGPIOヘッダと、JTAG用およびUART用のコネクタを接続した基板です。

ターゲットマシンはRaspberry Pi2ですが、将来的にPi Zeroでの利用も考えて、aitendoのPi Zero用のユニバーサル基板を使いました。
rpi-baremetal3.jpg

GPIOをそのまま接続した40pinボックスヘッダ、JTAG用の20pinボックスヘッダ、UART用の6ピンヘッダがついています。
GPIOのピン配列はこちらが詳しいです。

40pinボックスヘッダは、デバッグしながら他のI/Oも使いたい場合のために付けてあり、ここからフラットケーブルでブレッドボードなどに配線する想定です。
JTAGは手持ちの製品がSEGGER J-Link(のコピー品?)なので、ボックスヘッダもこの製品のピン配列に合わせて配線していますが、基本的にどこの製品でも20pinなら同じピン配列だと思います。
UARTは、以前から使っているスイッチサイエンスの製品です。6ピンになっていますが、配線はGNDとRX、TXだけです。
rpi-baremetal2.jpg

参考までに結線も載せておきます。

表面
rpi_jtag_uart_surface.png
裏面
rpi_jtag_uart.png


これをRaspberry Pi2につないで、Interface誌2017年2月号のDVDに入っている開発環境のVMをインストールして、Eclipse + OpenOCDでJTAG経由でのデバッグを試しました。
今回は記事の通りにすれば良かったので、かなり楽にできましたが、設定項目は複雑な上に「RPi2の場合は1回目はOpenOCDがうまく動かないので2回起動する」といった謎のバッドノウハウもあり、この記事なしに最初から自分でやろうとしたらかなり時間がかかったのではないかと思います。

なお、付録のDVDではOpenOCDで使用するJ-Link用の設定ファイルは
 /usr/local/share/openocd/scripts/interface/jlink.cfg

です。
インタフェースのシリアル番号を記入するようになっていますので、
# Example: Select J-Link with serial 123456789
#
jlink serial 000000123456

のように頭の0を省略せずに指定します。
また、openocdの起動は
$ sudo openocd -f /home/user/arm/cfg/jlink.cfg -f /home/user/arm/cfg/raspi2.cfg
のようにスーパーユーザの権限で行う必要がありました。

なお、初代RPiとRPi Zero Wは同じCPUを使っていますので、初代RPi用のベアメタルのオブジェクトならRPi Zeroでも動作するのではないかと思って試してみましたが、うまくいきませんでした。
posted by boochow at 00:27| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2017年11月18日

書籍「Programming with MicroPython」を購入

mp-book.jpg

オライリーから、「Programming with MicroPython」という本が出ましたので読んでいます。
ざっと内容を紹介すると、以下のような感じです。

1章:MicroPythonの歴史。なかなか興味深いです。Damien George(MicroPythonの作者)はPyBoardとESP8266+MicroPythonと、KickStarterを2回成功させているんですね。
他にも、micro:bitにMicroPythonが載ったのは、Damien Georgeの職場の隣の部屋にmicro:bitのボードを設計したARMのエンジニアがいて、頼まれたGeorgeが一週間でMicroPythonを動作するようにした、なんて話が載っています。
また、micro:bitの派生プロジェクトでドイツではCALLIOPEというプロジェクトが動いているそうです。
日本ではスイッチサイエンスさんのグループ会社のスイッチエデュケーションの活躍に期待したいところですね。

2章〜5章:ハードウェアの解説。PyBoard、micro:bit、Adafruit Circuit Playground Express、ESP8266/ESP32が取り上げられています。

6章:組み込みプログラミング概論。

7章〜12章:分野別、MicroPythonプログラミング。内訳はディスプレイ(LCDやNeoPixel等)、入力デバイス(ボタン、タッチセンサ、モーションセンサ、温度センサ等)、インタフェース(SPI、I2C、UART、I/Oピン)、ネットワーク(赤外線通信、micro:bitの無線送受信、WiFi、HTTP、MQTT)、サウンド、モーター制御です。

13章:MicroPythonで省メモリ、高パフォーマンスのプログラムを作成するためのノウハウ。MicroPythonにはconstという、Cでいう#defineみたいなものがあるのですが(この記事で使いました)、これは整数しか使えないしモジュール外からは参照できない、なんていう話も書かれていて参考になります。

14章:より詳しく知りたい人のためのガイド。

ということで、組み込みは初めてという場合にはどの章も参考になると思います。1章と13章はMicroPython特有の話なので、初心者でなくても楽しめると思います。
ラベル:MicroPython
posted by boochow at 13:11| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2017年11月14日

Raspberry PiベアメタルでMicroPythonの調査

Raspberry PiをOSを介さずに直接プログラミングすることを「ベアメタル・プログラミング」と呼ぶそうです。
マイコンだと、プログラミングといったらベアメタルが標準だと思いますが、Linuxを使っているとハードウェアは隠蔽されているので、プログラミングといったらカーネルを叩くことがせいぜいで、ハードウェアを直接触るプログラミングには別の名前をつけた、ということでしょうか。

Raspberry Piは、手元に1、2、W Zeroの3台があるのですが、現状ではほぼ積みボードになっていることもあり、MicroPythonをベアメタル・プログラミングでRaspberry Piの上で動かせないのかな? と思って少し現状を調べてみました。

まず、試みている人はいて、おそらく現状で一番進んでいるのはこちらです。

Porting Micropython to the Raspberry Pi – Part 2 – Stefan Naumann

言語のコア部分の動作は確認できていて、移植に際してアンアラインド・アクセスの設定が必要だった等の苦労話も書かれています。
同じ方の、MicroPythonフォーラムでの投稿です。

Raspberry Pi Port - MicroPython Forum

Wrong label-calculation for JUMP-Bytecode on Raspberry Pi, due to unaligned access ・ Issue #3201 ・ micropython/micropython

現状としては、main()から文字列をMicroPythonインタープリタに与えてLチカさせるところまではできているようです。


その先ですが、同じくRaspberry Piベアメタルプログラミングで動かしているIchigoJamのように、HDMIとUSBキーボードでMicroPythonのREPLが使えるようにするには入出力デバイス周りの実装が必要になります。

画面表示については、Raspberry PiのGPUを叩けばいいわけで、こちらにいろいろ先人の事例が紹介されています。

RaspberryPiのVideoCore IV(GPU)を使ってOS無し(ベアメタル)からポリゴン出して遊ぶ - Qiita


一方USBキーボードについては、USBプロトコルスタックを実装しなければならないわけで、これは「経験のある人でも半年かかる仕事」だそうです。

USB peripherals in bare metal? - Raspberry Pi Forums

とはいえ、先人の作ったものが使えればそんな苦労はないわけで、上記のリンクにも3つほどそういったものが紹介されています。
もっとも、マイコンと同様にUARTを使うのであれば、そのような苦労はしなくて済みます。
おそらくステップとしてはまずUARTからREPLを叩けるようにし、そのあと画面出力、次にUSBへと進んでいくべきでしょう。


さらにその先はどうでしょう? EthernetやBluetoothが使えるようになれば、ESP32版MicroPythonを凌駕したと言えそうです。
しかし、Raspberry PiではEthernetは内部的にUSB接続になっているので、まずUSB Host機能、さらにUSB Ethernetドライバが必要になると思われます。
そこまで実現しているプロジェクトとして、上記のリンクでも紹介されているultibo coreがあります。

Ultibo core a bare metal environment for Raspberry Pi - Raspberry Pi Forums

こちらはしかし、なんと全てPascalで書かれているそうです。別の意味ですごいです。

また、同じく上記のリンクで紹介されているcircleもUSBやEthernetのサポートがあります。こちらのほうは、C++です。

rsta2/circle: A C++ bare metal environment for Raspberry Pi with USB

MicroPythonをベアメタルで、かつキーボード、画面、ネットワークが使えるようにしようとすると、circleの上で動かせると良さそうではあります。
ただ、なかなか大きなシステムになってしまいそうです。
ちょっとcircleをダウンロードして見てみましたが、libだけで33000行、includeが1万行くらいです。
また、ライセンスがGPL3.0なので、MicroPythonのライセンスとは合わない感じです。


既存のコードを使わないとすると、自前で最低限のI/Oを実装しなければなりませんが、そういった点で参考になりそうなのは、上にも挙げたQiitaの記事を初めとしたネット上の記事と、以下の書籍です。

BareMetalで遊ぶ Raspberry Pi - 達人出版会

2017年2月号目次|Interface

両方とも購入してみましたが、上の書籍ではベアメタルで開発したバイナリをU-bootを使ってネットワークブートする手法が書かれているのが面白いと思いました。
下のほうはInterface誌ですので丁寧ですし、開発環境をインストールしたVMが入ったDVDが付属しています。

ただ、どちらもUSB Hostの実装まではたどりついていません。HIDデバイスだけなら、Arduino用のライブラリとかを見ながらやれば何とかなるのかもしれませんが・・・。

felis/USB_Host_Shield_2.0: Revision 2.0 of USB Host Library for Arduino.

というわけで、今のところ「USBキーボードとUSB経由のイーサネットをどうするか」が一番の課題のような気がします。
ラベル:MicroPython
posted by boochow at 21:14| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2017年11月12日

1.5インチのOLEDモジュール

oled1-5.jpg

OLEDモジュールは0.96インチと1.3インチのものを持っていたのですが、Aliexpressで1.5インチのものを見かけて買ってみました。
1.3インチはArduboyで使われていたサイズです。
1.5インチは、たった0.2インチの差ですが結構大きく感じます。
また、面積が大きいせいか、ピクセルが明るく感じられます。
ただ、このサイズになるとピクセルがはっきり見えてしまって、128×64よりも高い解像度が欲しいような気がしました。
QRコードなどを表示させるなら、このサイズのほうが良いかもしれませんが。

コントローラはSSD1309というものらしいですが、ドライバはSSD1306のもので問題なく動作しました。
posted by boochow at 17:48| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする
人気記事