Sunflat のブログ

ソフトウェア開発についての話題が多いかも

PicoPad (2)

前回、PicoPad がブレッドボード上で動作したので、今度はユニバーサル基板を使って組み立ててみた。

まずは、Affinity で配線図を描いた。両面基板を使って、LCD の裏側に Raspberry Pi Pico (の互換機)を配置することにした。

今回は配線に ジュンフロンETFE電線 を使ってみた。より線のビニル電線とかと比べて、固いのではんだ付けする時に固定しやすいし、細いので基板の穴も通過できて便利だった。

底面の電源基板には、セリアで買ったポリスチレンプレート プラ板(厚さ1.8mm)を使用 。やわらかいので、のこぎりで切ったりピンバイスで穴を開けたりしやすくて便利だった。電源には、単4の eneloop 3本を、昇圧DCDCコンバータ で5Vにして利用。電源回路はセロテープと両面テープとグルーガンで固定。

横からの見た目

ブレッドボードでの試作段階ではなかなか安定動作しなかったMP3プレーヤーも、抵抗と電解コンデンサーを追加したおかげで無事動作して良かった!

PicoPad (1)

Rasberry Pi Pico を使った PicoPad をブレッドボードで組み立ててみた。ひとまず動作した!

補足

  • 音が出る時になんかLCDにノイズが入るので、Geminiに相談してみたら、BAT(スピーカーの+端子)とGND(トランジスタのエミッター)との間に100μF程の電解コンデンサーを入れろと言われたので、試してみたらノイズが無くなった。Geminiすごい
  • リチウムポリマー電池はなんか怖そうなので、バッテリー充電回路は省略して、単四のeneloop3本で代用した
  • 使っている Rasberry Pi Pico が AliExpress で買った安い互換機だからなのか、VSYS に2.8Vぐらいの電圧を入れているときに、3V3端子に2.6Vぐらいの電圧しか来ておらず、LCDが暗くなってしまう。VSYS に5Vを入れれば問題なさそう
  • 同じく、 AliExpress で買った安い Rasberry Pi Pico 2 の互換機 も試してみたが、こちらはそもそも PicoLibSDK に入っているバイナリ(!PicoPad20 ディレクトリのもの)が動作しないっぽい?? !Pico2 ディレクトリのバイナリなら動作するんだけど。互換機だから何か違うのかも...
  • eneloopを昇圧DCDCコンバーターで5VにしてBATにつないでみたら、電流が多すぎるためかeneloopの電圧降下がひどく、逆にLCDが暗くなった。スピーカーの+端子と、BAT(電解コンデンサーの+)との間に100Ωの抵抗を入れたら、音は小さくなったけど電流が減っていい感じになった

PicoLibSDK の開発環境をセットアップ

PicoPad用のアプリを開発するための PicoLibSDK をセットアップした。 AI Agent に開発環境を自由に使ってほしいので、Docker container 内に開発環境を用意した。

docker-compose.yml

services:
  tools:
    build:
      context: .
      dockerfile: Dockerfile
    tty: true
    volumes:
      - type: bind
        source: "[PicoLibSDKを展開したホストPCのディレクトリのパス]"
        target: "/prj/PicoLibSDK"
        consistency: cached
      - type: volume
        source: gemini_data
        target: /root/.gemini

volumes:
  gemini_data:
    name: gemini_data
    external: true

Dockerfile

FROM ubuntu:noble

WORKDIR /root

RUN apt-get update --quiet --yes \
    && apt-get upgrade --quiet --yes \
    && apt-get autoremove --quiet --yes \
    && apt-get install --quiet --yes wget xz-utils git

RUN wget https://developer.arm.com/-/media/Files/downloads/gnu/15.2.rel1/binrel/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi.tar.xz \
    && tar -xf arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi.tar.xz -C /opt/ \
    && rm arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi.tar.xz \
    && echo 'export PATH=$PATH:/opt/arm-gnu-toolchain-15.2.rel1-x86_64-arm-none-eabi/bin' >> /root/.bashrc

# RUN wget https://buildbot.embecosm.com/job/riscv32-gcc-ubuntu2204-release/10/artifact/riscv32-embecosm-ubuntu2204-gcc13.2.0.tar.gz \
#     && tar -xzf riscv32-embecosm-ubuntu2204-gcc13.2.0.tar.gz -C /opt/ \
#     && rm riscv32-embecosm-ubuntu2204-gcc13.2.0.tar.gz \
#     && echo 'export PATH=$PATH:/opt/riscv32-embecosm-ubuntu2204-gcc13.2.0/bin' >> /root/.bashrc

RUN apt-get install --quiet --yes make g++ python3

# COPY --chmod=644 .gitconfig /root/.gitconfig

RUN mkdir -p /prj

WORKDIR /prj/PicoLibSDK

あと、_tools ディレクトリにある各種ツールの、Linux x86_64用のバイナリをビルドする必要があった。PicoLibSDK のルートに以下のようなスクリプトを配置して、Docker内で実行すればよさそう

initial_setup.sh

#!/bin/bash -eux
SCRIPT_DIR=$(cd $(dirname $0) ; pwd)

cd $SCRIPT_DIR
if [ ! -x "_c1.sh" ]; then
    find . -type f -name "*.sh" -exec chmod +x {} \;
fi

cd $SCRIPT_DIR/_tools/elf2uf2
g++ -o elf2uf2 main.cpp

cd $SCRIPT_DIR/_tools/PicoPadLoaderCrc
g++ -o LoaderCrc LoaderCrc.cpp

# Image tools 64-bit patch and build
IMAGE_TOOLS="RaspPicoImg PicoPadImg PicoPadImg2"
for TOOL in $IMAGE_TOOLS; do
    cd $SCRIPT_DIR/_tools/$TOOL
    # PicoPadImg2 source is named PicoPadImg.cpp, others match tool name
    SRC="$TOOL.cpp"
    OUT="$TOOL"
    if [ "$TOOL" == "PicoPadImg2" ]; then 
        SRC="PicoPadImg.cpp"
        OUT="PicoPadImg"
    fi

    sed -i 's/typedef signed long int s32;/typedef signed int s32;/g' $SRC
    sed -i 's/typedef unsigned long int u32;/typedef unsigned int u32;/g' $SRC
    g++ -o $OUT $SRC
done

Antigtavityでゲームアプリを作ってみた

AI agent の Antigravity に、「スーパーマ〇オブラザーズ風の2Dプラットフォーマーゲームを作って」と頼んだら、以下のようなゲームが出来た。

ほえ~

参考サイト

Tiny Joypad (2)

前回、Tiny Joypad がブレッドボード上で動作したので、ユニバーサル基板で組み立ててみた。

まず、最近無料になった Affinity で配線図を描いてみた。シンボルとか使えてなかなか便利そう。

手はんだで配線。結構細かくてしんどい…。色々コゲたりはがれたりしたけど(?)なんとか完成した。

公式サイトからゲームをダウンロードして動かしてみた。いいね!

www.tinyjoypad.com

Tiny Joypad (1)

以下の記事を見て、ATtiny85を使ったミニゲーム機 Tiny Joypad を作ってみたくなった。

burariweb.info

電子部品は、電子工作ステーションAliExpress などで購入した。条件を満たせば送料無料で送ってくれるのでありがたい。

electronicwork.shop

ATtiny85 にゲームデータを書き込むために Arduino IDE の設定をしたところ、どうやらボードマネージャのURL(http://drazzy.com/package_drazzy.com_index.json)が使えなくなっていたり、Arduino IDE 2.x.x に対応していなかったりするらしく、以下の記事を参考に手動でセットアップする必要があった。

qiita.com

また、ボードマネージャの Arduino AVR Boards を v1.8.7 にアップデートすると、以下のようなエラーが出て書き込みが出来なくなるようで、これを v1.8.6 にダウングレードすると書き込みができるようになった。

Warning: programmer wiring fails to specify prog_modes = PM_...; [...\avr\avrdude.conf:350]
Warning: programmer arduino fails to specify prog_modes = PM_...; [...\avr\avrdude.conf:357]
Error: unknown token [...\avr\avrdude.conf:392]
Warning: programmer avrftdi fails to specify prog_modes = PM_...; [...\avr\avrdude.conf:392]
Error: syntax error [...\avr\avrdude.conf:392]
Error: unable to process system wide configuration file ...\avr\avrdude.conf
Failed to burn bootloader: uploading error: exit status 1

ブレッドボードで組み立てて動作確認。なかなかいい感じ!

電源は、ボタン電池(CR2032)だとパワーが足りないのかうまく動作しなかったが、eneloop(単4)x3をつなげばちゃんと動作した。

カロリー計算アプリ「食事日記帳」を作った

利用していたレコーディングダイエット用のサービス(食べたものを記録&カロリー計算をして、食生活を改善する)がサービス終了してしまったので、代わりになりそうなカロリー計算アプリを作ってみた。

ダウンロード(Android&Windows用,無料)

操作方法

食品の登録方法

日本食品標準成分表 のデータを内蔵しているが、料理や市販の食品は入っていないので、自分で登録する必要がある。ちょっと操作が複雑なので、補足説明。

続きを読む

はてなブックマークのRSSからthresholdパラメータが削除されたので、Netlify Functions を使って自力でフィルタする

はてなブックマークの新着エントリーのRSSから、一定以上のブックマーク数のものだけをフィルタしたRSSを作成するやつを作った。

github.com

以前、はてなブックマークの新着エントリーのRSSには、thresholdパラメータをつけて一定以上のブックマーク数のものだけをフィルタすることができた。 しかし、最近この機能がなくなってしまったようで、大量のエントリーがRSSリーダーに表示されて困っていた。

RSSの中身を見ると、各itemごとに hatena:bookmarkcount という要素がついていて、ブックマーク数を表すっぽいので、これでフィルタできそう。

Yahoo Pipes も無くなっちゃったし、herokuの無料枠も別の用途で使っているので、フィルタするコードを無料で動かせそうな場所はどこかに無いかなと探してみたところ、NetlifyのFunctions 機能が良さげだった。AWS Lambda のラッパーみたいだけど、125,000リクエスト/月、100時間/月 までは無料で使えるのでありがたい。

デプロイ先は公開していないので、もし使いたい人がいたら、上記のリポジトリを自分でNetlifyにデプロイして使って下さい。

ちなみに、RSSリーダーinoreader を使ってます。30分に1回リクエストが発生するので、1回の処理時間が5秒として、1ヶ月でだいたい1500リクエスト&2時間。余裕で無料枠に収まりそうな感じ。