マイコン工作実験日記

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

Serendipitous Circles

2017-07-23 20:16:24 | Weblog
当初はSTM32F446のUVCがまっとうに動くよになったら、DCMIを使ってカメラをつなげてUSBカメラを作ってみようと企んでいたのですが、High speedが安定動作せずに作業が停滞している間に、カメラを繋げようという意欲が萎えてしまいました。

文字表示はできたので、今度は簡単にグラフィックス表示をしてみようと考えて、512x512ドットのモノクロ表示のグラッフィック表示機能を追加してみました。このサイズなら 512/8*512 = 32KB のRAMをフレームバッファとして使うことで表示が行えます。モノクロ表示で、それなりに楽しめる題材を考えていたら、その昔 BYTEマガジンに掲載されていたプログラムを8ビットマイコンで動かして楽しんでいたことを思い出しました。

Serendipitous Circlesという記事なのですが、今でもアーカイブにて読みことができます。素晴らしい!! 楕円上の座標を導出する差分方程式をベースとした簡単なアルゴリズムを使っているのですが、始点の座標を変えたり、わざと演算オーバフローを発生させることで描画する座標をラップさせたりすることで、簡単な演算で思いもよらない描画結果を楽しめます。基本的な処理は
int16_t xpos, xpos;

xpos = initial_x;
ypos = initial_y;

while (1) {
  plot(xpos, ypos);
  xpos = xpos - ypos /2;
  ypos = ypos + xpos /2;
}

と、するだけです。画面の大きさは512ドットしかありませんので、上位の9ビットの値を使ってプロットしてやります。例えば、(0x6000, 0)を初期値として上記の処理を繰り返すと、画面中央を原点とした次のような楕円を描くことができます。

同じ演算結果を、今度は画面の左下を原点として表示し、はみ出した部分は画面上でラップして表示してやると、次のように楕円を4隅に分割して描くことができます。

また始点座標を大きくとってやると、16ビット演算のオーバフローが頻繁に発生し、その結果が画面上でのラップ表示として反映され、予想もしないような結果を得ることができます。

その他詳しくは 元記事を参照していただくこととして、デモ動画を作成したので、こちらをご覧ください。



  • このデモではプロットする際にXORを使っています。そのため、演算結果の座標が以前プロットした点と同じ座標になった場合には、その点が点滅することになります。画像がチラチラしたり、時には円が回っているように見えたりすることもあって面白いです。画像の大半が消えかけそうになることもあります。
  • 動画はQuick Cameraというアプリでカメラからの画像を表示している様子をキャプチャしたものです。最初はMacbookの FaceTimeカメラでボードとUSB PHYを撮影していますが、途中でカメラ入力をこのボードで動いているUVCカメラに切り替えることでデモ画像に切り替わっています。
  • いくつかのパターンを順番に表示していますが、全て中心となる演算は同一です。(X, Y)の初期値、原点の取り方、演算結果の表示ビット位置を変化させることで、表示パターンが変化しています。
  • 演算で使用する係数を変えてやれば、結果の画像にも変化が生じます。BYTE MagazineのApril 1978に、いくつかの例が紹介されている記事が掲載されています。