マイコン工作実験日記

Microcontroller を用いての工作、実験記録

Cortex-M33/23

2016-10-26 22:45:56 | Weblog
開催中のARM Tech ConnでCortex-M33とCortex-M23が発表になったようです。来年には実物が出てくるんでしょうか?いくつかのブログ記事で、その概要が紹介されています。

https://community.arm.com/groups/processors/blog/2016/10/25/cortex-m23-and-cortex-m33-security-foundation-for-billions-of-devices
https://community.arm.com/groups/processors/blog/2016/10/25/five-key-features-of-the-arm-cortex-m23-processor
https://community.arm.com/groups/processors/blog/2016/10/25/five-key-features-of-the-arm-cortex-m33-processor

そして、ARMを買収したあの方も"IoT"を連発しています。


UVCで文字表示してみる

2016-10-23 19:09:21 | Weblog
UVCでのカラーバー表示ができたので、今度は文字を表示してみることにしました。カメラに送る画像情報はYUV422と呼ばれる形式で送るのですが、この形式では輝度情報は各画素についているものの、色差情報は2画素をペアとして扱ってつけています。そのため、1画素毎に輝度は変えられても、色を変えることができません。そのため、文字フォントを描画した時に2画素ペアにまたがっていればきちんと色がつきますが、ペアの片側にしか描画しないと文字の輪郭の色がおかしくなってしまいます。そこで、必ず文字のグリフを描画する際には横に2倍に引き伸ばして、必ず2画素ペアにまたがるようにして表示してやりました。



もともとの画面サイズが160×120のところ、文字を横に2倍にしていますので、実質的には80×60ドット相当の画面となってしまっています。ここでは、STM32CubeL4に含まれていた Font12という7×12ドットのフォントを使っています。文字情報量が少ないうえに画面の更新レートも少ないので、表示装置として使うには制約が大きいわけですが、時計とか気温/気圧表示のような用途には充分に使えるのではないでしょうか。

YUV表示でもUVは常に同じで輝度(Y)しか変化させないということにしてやれば、文字幅を2倍にしなくても1画素ごとに輝度を変えて文字表示することができますので、こちらも試してみました。背景色は (Y, U, V) = (0, 0, 0), 文字色は (Y, U, V) = (255, 0, 0)として描画してやると...



文字色のYの値を変化させてやれば、こうなります...



なんか、昔のグリーンモニタ表示を彷彿させますなぁ。

UVCサンプルを動かす

2016-10-20 22:14:20 | USB
GitHubで見つけたSTM32用UVCの試験ブログラムからコードを引っ張ってきて使ってみたら、わりとアッサリと動いてくれました。もともとのコードはグレーから白に全画面の色が変化するだけなので、いまひとつ動いている実感に欠けます。そこで、XMOSのサンプルのようにRGBのカラーバーを表示して、スクロールさせてみました。







表示にはWindows 10のカメラアプリを使用。ソフトでは160×120の画面情報を送っているのですがカメラアプリが自動的に拡大表示してくれているようです。

Ubuntu上でもcheeseを使って同じように表示できることを確認できたのですが、Mac上でPhoto Boothを使って画像を表示しようとすると、Photo Boothが例外エラーで止まってしまいます。どうして!? WIndowsはMacの上の仮想マシンで動いているのに。。。

画面情報はIsochronous転送で1ms毎に 1ラスタ分のデータを送信していますので、120ラスタから成る1画面を送るには120msかかることになり、8.3FPSに相当します。1ラスタ分のデータを送信するペイロードは、ヘッダ2バイトとYUVデータ320バイトの合計322バイト長になります。エンドポイントのwMaxPacketSIzeを倍にして、1度に2ラスタ分を送ろうと試みたのですが、そうするとカメラを認識してくれません。どうやらwMaxPacketSizeが512バイトを超えるとカメラとして動いてくれないようです。Mac OSX(or WIndows?)のUSBバンド幅の管理制御によって制限を受けているのでしょうか??

UVCサンプルを探してみた

2016-10-18 21:42:13 | USB
Nucleo-L476RGにUSBミニコネクタを繋げたので、これだけでハードの準備は完了。次はソフトの準備に取り掛かります。カメラ画像をUSBで送るには、STM32L476でUVC (USB Video Class)のデバイス機能を実現すれば良いわけですが、CubeMX並びにSTのUSBドライバではUVCクラスのドライバは提供されていません。USB Coreの上に自分でクラスドライバを作ればいいのですが、正しく実装するためにはデバイスディスクリプタから正しく用意してやることが必要となります。

ディスクリプタについてはUVCの仕様書でもサンプルが説明されていたりしますが、簡単に実装して動作試験するためには低機能でも構わないのでできるだけシンプルな方が好都合です。そこで、マイコンを使ったUVCについての資料を探してみようと考えググってみると、XMOSのAPノートが見つかりました。480×320の単一解像度しか持たないUVCデバイスをカメラ無しで擬似的に実現する内容となっています。ハードとしてカメラを使わないので、カラーバーを表示することしかできないというデモですが、実験としては十分に面白いので、このアイデアはそのままいただくことにします。ソースも提供されており、ディスクリプタの具体的な内容もよく分かり助かります。また、ドライバのコードの作りとしては、エンドポイント毎にスレッドを動かす構成となっているようで、このあたりがXMOSらしくて興味をそそられるところなのですが、深入りすると戻ってこれなくなりそうな予感もするのでこれ以上の追求はやめておきます。

次に、GitHubでSTM32を使ったプロジェクトを探してみました。



iliasamさんのプロジェクトは白黒画像データをPCに送るコードが用意されていますが、古いライブラリを使っているようです。coelamonさんのpractice_eclはiliasamさんのコードがベースになっているようですが。現在のHALを使っているのでそのまま流用できそうす。そこで、コイツを拝借することにしました。

USBコネクタさえあれば

2016-10-16 17:36:59 | Weblog
OV2640もUXGAの画像まで読み取ることができたので、なんとなく自己満足して停滞中です。カメラとしてはやはり撮影時に画像をモニタできないのがとっても不便だったので、USBでPCに送ってみようかと思います。これまでOV2640は手持ちの秋月の角型ランドのB基板に載せて使っていたのですが、薄いのでUSBコネクタをつけて抜き差しするには向いていません。しょうがないので、もう一枚別にBサイズ基板にUSBコネクタだけ載せることにしました。



STM32L476のUSBはプルアップ機能内蔵なので、USBコネクタさえつなげてやればUSBデバイス機能を使うことができます。Nucleoシリーズとして基板が共通化されているからしょうがないのでしょうが、USBコネクタが追加可能な基板になっていればどんなに便利だったことでしょう。

さてUSB Video Class(UVC)を使ってカメラの画像をUSBで送ろうとすると、通常はデータ量が大きいのでUSBハイスピードが必要になります。しかしながら、JPEG圧縮した結果をフレーム数を落として送るのであればフルスピードまでしかサポートしていないSTML476でも十分に画像を送れるはずです。