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月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年04月28日

HDMI接続ができる3.5インチ液晶ユニット

Amazonを見ていたら、「HDMI入力付き」のRaspberry Pi用のLCDユニットを見つけ、値段も2980円と安かったので、ためしに買ってみました。
解像度は480×320というよくあるものですが、HDMI入力は1920×1080を受け付けます。
給電はMicro USB端子になります。

ためしにRaspberry Pi Zero Wにつないでみた様子です。
解像度は1920×1080なのですが、ちゃんと全体が映っています。
アスペクト比が合っていないので、縦長ではありますが・・・。

osoyoo_00.jpg


もちろん、実際の解像度は低いです。字は読めないですが、解像度よりも大きさが問題な気もします。


osoyo_002.jpg


裏面です。Realtek RTD2660Hが搭載されています。
検索してみると、HDMIディスプレイのドライバとしてメジャーなチップのようです。


osoyoo_01.jpg


他のRaspberry Pi用LCDユニットと違い、特別なドライバが要らないのはメリットだと思います。
HDMI端子はディスプレイの上側になりますので、Raspberry Pi以外のものと接続するときはちょっと使いにくいかもしれませんが、面白い製品です。
posted by boochow at 00:44| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする

2017年03月20日

Raspberry Pi Zero WとESP32のサイズ比較

rpizerow.jpg

実はRaspberry Pi Zero Wも買ってみたりしています。
小さくてオールインワン、という以外に初代Raspberry Piとあまり違わなさそうなので、若干モチベーションは低いですが、そのうちいじってみようと思います。

ESP32 DevKitと並べて写真を撮ってみました。
こうしてみると大きさはわずかにPi Zero Wのほうが大きい、という程度です。

大きさも値段もほぼ同じ(Pi Zero Wは送料込みで13.5ポンドでした)というこの2つのボードですが、スペックはCPUクロックで4倍、RAMの容量に至っては1000倍の開きがあります。
趣味としては窮屈な環境で工夫をするほうが面白いのですが、将来どちらが主流になるかというと、やはりリソースが潤沢なほうになるのかもしれません。
posted by boochow at 17:11| Comment(0) | Raspberry Pi | このブログの読者になる | 更新情報をチェックする
人気記事