SHIROのIchigoJam日記

マイコン「IchigoJam」(イチゴジャム)の電子工作とプログラミングをメインに

IchigoJam Q

IchigoJamの最新バージョン「IchigoJam Q」が発売になりました。
hello002.stores.jp
hello002.stores.jp
ハーフキットを取り寄せて、組み立ててみました。


ハーフキットのパッケージ。


基板。「基板の製造・実装を国内メーカーに切り替えた」とのことですが、材質やデザインが初代IchigoJam基板にそっくりなので、同じメーカーかもしれません。
付いているICはLPC1114で、IchigoJam Sと同じです。


はんだ付けして完成。


Sとの一番の違いは、電源USB端子がType BからType Cに変更されたことです。
秋月電子ではこちらのパーツが使えそうです。

世の中のUSBケーブルも、だんだんType Cが一般的になってきています。
あと、はんだ付けの際にType B端子の足が折れる事故が頻発していたのですが、今回のType C端子は足が太く、あらかじめ90度曲げられているので、折れる事故は減りそうです。


SとQの比較。電源端子以外はほぼ変わっていません。


モニタとキーボードをつないで電源ON。
ファームウェアは1.4.3の日本語キーボード版でした。
ファイル3番に日本語/英語キーボード切替ツールが入っているので、英語キーボードを使いたい人はそれを実行すると切り替えできます。

電子100mダッシュ

IchigoJamでおなじみの100mダッシュを、ロジックIC回路で作ってみました。
紹介動画はこちら。

www.youtube.com

遊び方

  • 電源スイッチを入れるとブザーが鳴るので、リセットボタンを押して止めます。
  • 3秒くらい経つとスタートLEDが点灯してタイマーのカウントが始まるので、RUNボタンを100回連打して100m走ってください。
  • ゴールするとタイマーが止まって、走ったタイムがわかります。
  • リセットボタンを押すと、再度走れます。
  • スタートLEDが光る前にRUNボタンを押してしまうと、フライングの反則になってしまいます。


外付けの大型ボタンでも走れます。

回路図


スタートLED制御

  • 早押し対決ゲームと同じく、コンデンサの充電回路とNANDゲートを使って、数秒経つとスタートLEDが光るようにしています。2つのNANDゲートの中間の出力はLED点灯前はHですが、その信号をタイマー信号の周波数を低減する74390(後述)のCLR入力へ送っているため、LED点灯前はタイマー信号が出力されず、時計が進みません。また、ゴール判定やフライング判定でもこのNANDゲートの出力を使っています。

RUNボタン

  • RUNボタンの回路は、シュミットトリガNANDゲート・4093を使ってチャタリング防止をしています。ここから出力されたボタン信号は、走行距離表示用の7セグメントLED・M1のCLKへ入力されます。今回は10進カウンタIC・4026を内蔵した7セグを使っているので、CLKへパルス信号を入力するだけで+1ずつカウントアップします。またCARRY(桁上がり)信号を次のM2のCLKへ送ることで10の位もカウントアップします。この7セグのお陰で回路が簡単になり、部品数も少なくなっています。

タイマー

  • 時間を計るタイマーは、オシレーターIC・LTC1799がベースになっています。外付けの抵抗R6によって発振周波数が決まるのですが、今回は10kΩを付けて100kHzのタイマー信号を発振しています。ちなみに抵抗を1MΩにすると1kHzまで周波数を下げられますが、精度が悪くなるので今回は10kΩにしています。
  • この100kHzのタイマー信号を2進/5進カウンタ・74390へ入力して、周波数を下げています。ICの中にカウンタが2個入っていて、1個のカウンタで周波数を1/10にできます。今回はICを2個=カウンタを4段使って周波数を1/10000に下げて、10Hzの信号を作っています。10Hzは1秒間に10パルスなので、0.1秒ごとに1パルスになります。このタイマー信号をタイム表示用7セグへ入力して、0.1秒刻みのタイムを表示しています。
  • ちなみに試作機のタイマーは、1分間で0.5秒ほどの誤差でした。(金属皮膜抵抗R6の誤差が±1%なのでだいたい合っています)。100mダッシュのタイムは10秒前後なので、0.1秒程度の誤差が出ることになります。今回はその程度の誤差はありだろうということで、そのままにしています。VR(可変抵抗)をつけて時計を調整できるようにすることも考えたのですが、はんだ付けする部品が増えてしまいますし、子どもたちは時間進行を遅くして良いタイムが出るようにチートしてしまうでしょう。同じ基板を使って代わる代わる走れば、みんな同じ条件ですし。

ゴール・フライング判定

  • ゴールとフライングの判定は、Dフリップフロップ・7474を使っています。初期の出力は「Q=L/Q=H」になっています。
  • スタートLEDが光る前は、7474-BのD入力がHになっています。そこでRUNボタンが押されるとCLK入力に信号が入って、フリップフロップがセットされて出力が「Q=H/Q=L」に切り替わり、フライングLEDが光ってブザーが鳴ります。同時にQのL出力が、ダイオードで作ったANDゲートを通してボタン回路のシュミットトリガNANDゲート・4093-1へ送られて、ゲートの出力がHで固定されます。そのためボタンを押しても走れなくなってゲームがストップします。
  • 100m走ってゴールにたどり着くと、距離表示7セグの10の位・M2のCARRY出力がHになります。この信号は7474-AのCLK入力へつながっているため、フリップフロップがセットされて出力が「Q=H/Q=L」に切り替わり、ゴールLEDが光ってブザーが鳴ります。同時にQのL出力が(フライング時と同様に)ボタン回路へ送られてそれ以上走れなくなります。またデジタルトランジスタ・DTC143ELをOFFにして、タイム表示用の7セグのCLKI端子がHになるため、表示がゴールタイムで止まります。

リセット

  • リセットボタンを押すと、抵抗R12を通して回路がGNDへ接地され、ゲームにリセットがかかります。
    • ダイオードD1を通してコンデンサC1が放電されて、スタートLEDが消えます。
    • ダイオードD2,D3を通してフリップフロップ・7474のCLR端子がLに落とされ、ゴール・フライング判定をリセットします。
    • NANDゲート・4093-4を通して信号をHに反転し、走行距離とタイムを表示している7セグメントLEDのRST端子をHにして、内蔵10進カウンタをリセット。表示を0に戻します。

基板データ

*この基板データは、CC BYライセンスとします。どうぞご利用ください。

(C) 2023 Shiro Saito (https://www.ichigojaman.jp)

材料

以下の順番ではんだ付けすると作りやすいです。

最後にICをソケットにはめます。

以下は外付けボタン用のオプションです。

画像生成AI「Stable Diffusion」

自宅のPCでここしばらく、画像生成AI「Stable Diffusion」を試していますが、なかなか面白いです。
数日試行錯誤してできた画像がこちら。ローカル線の列車旅をイメージして作りました。

こちらは記念撮影風。

PCの前で数日あれこれやれば、こんな画像ができてしまいます。
「どうしてもこの場所で撮りたい」という観光や宣伝の写真はともかく、一般的な広告画像などは今後ほとんどがAI生成に置き換わってしまうのではないでしょうか。モデル・カメラマン・スタイリストなどの方々は仕事の危機だと思います。

環境作り

Stable DiffisionをローカルPCで動かす方法は、ネット上にいろいろな情報が出ています。
私はこちらを参考にしました。
freeblog-video.com

PCのハードウェアですが、CPUはそこそこで大丈夫ですが、RAMは16GBは必要。
そしてVRAMを大量に搭載したNVIDIAグラフィックカードが必要です(グラフィックカードのCUDA機能で計算するため)。
満足に使えるのはVRAM 12GBのカードで、4万5千円くらいします。これで画像1枚を生成するのに15秒~1分くらい(設定によって変わる)。
VRAMが少ないと、画像生成でエラーになったり、ものすごく時間がかかったりします。
私はこちらのカードを購入しました。
kakaku.com

画像作成の環境作り

作成したい画像によって、Stable Diffusionへモデルや拡張機能をインストールします。
gitのほか、こちらのサイトから探してダウンロードできます(※会員登録が必要)。
civitai.com
今回使ったのは以下のとおりです。

  • モデル:kisaragiMix
    • 標準搭載モデルではあまり可愛い女の子が描けなかったので導入。インストール後にStable Diffusion内で「このモデルを使って生成する」と指定します。
      使うモデルによって人物だけでなく背景もかなり変わります。いくつかのモデルを試しましたが、モデルによっては何度生成しても駅や線路を描いてくれません。
  • 拡張機能:ControlNet
    • 拡張機能は一種のプラグインで、インストールするとStable Diffusionに機能が追加されます。ControlNet内の「openpose」という機能を使うと、人物画像からスケルトン(骨組み)を解析して、それを元に同じポーズの人物を描画してくれます。横向きの女の子を描くのに使いました。
  • 拡張機能:Tiled Diffusion
    • Stable Diffusionが生成する画像は、基本的に512×512ドットのサイズです。1024×1024ドットも指定できるのですが、VRAM 12GBでも足りず生成画像が荒れてガサガサになります。
      ですので、512ドットで生成した画像の中から使えそうなものを選んで、img2img(画像を見本にして別の画像を作る機能)で1024ドットに高解像度化して完成作品にします。
      (単なる解像度変更ではなく、プロンプトや設定に従って画像を再生成します)
      この時にTiled Diffusionが元画像をタイル分割して処理するので、VRAMが少なくても高解像度化できます。
  • LoRA:Pure Innocent Girl
    • LoRAも一種のプラグインで、モデルと同じように特定の人物や背景を描画します。
      img2imgで高解像度化する時にこのLoRAを使うと、女の子の顔が可愛く修正されます。本当は最初の画像生成で使いたいのですが、使うと駅や線路を全く描いてくれなくなります。
  • 拡張機能:Config Presets
    • Stable Diffusion内で指定したプロンプトや設定は、ソフトを終了するとリセットされて消えてしまいます。
      この拡張機能を入れると、現在の設定に名前を付けて保存して、プルダウンリストで呼び出すことができます。

失敗作いろいろ

AIが勝手に描画するので、指示してもなかなか思ったとおりの画像になりません。100枚画像生成して、使えるのは2~3枚くらい。「下手な鉄砲、数打ちゃ当たる」方式です。予想外なものを描いてくれて逆に面白かったりもしますが。
以下、「下手な鉄砲」の失敗作を。「AIってこんな画像を作るんだ」と参考になれば。

駅や線路が全くありません。生成された画像の半分くらいはこんな感じです。


なぜか山の中へ。廃線跡


列車が登場。どこの国でしょうか。


海を走る列車。幻想世界。


列車はやめて、船に乗ることに。


竜宮城へ着きました。出迎えもいるようです。

駅少女シリーズ

その他の作品。

追記:その後

Stable Diffusionがとにかく駅や線路をまともに描いてくれなくて苦労しています。
Microsoft Bing の Image Creatorを使うとそれなりに描いてくれることがわかったので、

  • 背景はBing Image Creatorで出力
  • 女の子はStable Diffusionで描画
    • 立っている女の子だけなら、生成画像サイズを縦長にすれば解像度を上げてもメモリ不足にならず、一発で綺麗な女の子が描けます。
  • 2枚の画像をPhotoshopで合成

という手順で作ってみました。


だいぶましな風景になりましたが、もっとホームが短くて、架線が無い非電化のローカル線の駅を、自分の中ではイメージしていました。
AIの時代になっても、結局は「本当に欲しいものは自分で作るしかない」という、ものづくりの基本に立ち返るお話でした。

追記:完結編

駅や線路の風景がうまく描けなくて四苦八苦してきました。使う学習モデルを選択して画像を作成するのですが、

  • (1)指示のテキスト(プロンプト)から512×512ドットの画像を生成
  • (2)その画像を元に再度描き直して1024×1024ドットに拡大

と2段階で作成します。
(学習モデルは元々512×512ドットの画像で学習しているので、いきなり1024×1024ドットの画像を生成すると絵がおかしくなる)
そこで、(1)では風景に強い学習モデル、(2)では女の子が可愛く描ける学習モデルと、2種類のモデルを使い分けて生成すると、だいぶいい感じの絵が描けました。

まだまだソフトの使用レベルは序の口ですが、これで一応完結編とします。

いろいろトライして改めて気づいたのですが、学習モデルはネット上に存在する多数の画像から学習しているので、

  • 生成される画像の造形・画角などが、ネット上によくある画像に引きずられる
  • 逆にネット上に無いような造形は生成されない

コミック・アニメ調のイラストだと架空世界なのでまた違うのでしょうが、こうした実写の画像は現実にかなり引きずられます。逆に現実に無いような新しい画像はなかなか作られません。よくも悪くも学習AIの限界でしょうか。