AVTOKYO 2017
http://ja.avtokyo.org/avtokyo2017
で配布されたバッジ。

IMG_20171117_220158.jpg
左:フル版(個人スポンサーなど向け用)  右:ボタン3つ版(一般参加者頒布用)

内蔵プログラムの機能

  • Drink Ticket Request
  • clicker(ミニゲーム)
  • mini CTF(ミニゲーム)
  • username edit
  • credit
  • factory reset

内蔵プログラムについての解説はこちら
https://qiita.com/lowlevel/items/12c55ce9260e7d369989

フル版とボタン3つ版の違い

ボタンの数の違いだけです。
なお、内蔵プログラムはボタン3つしか使用していません。

 Inside Hardware

image.png

搭載マイコンチップ

STM32F103C8

STMicrosystem の、32bit ARM マイコンです。

  • Cortex-M3 Core
  • CPU Clock 72MHz
  • Flash 64KBytes(※)

スペック上は64KBytesですが、実際には128KBytesが搭載されています。

STM32の開発環境についてどのようなものがあるかの説明はこちら
https://qiita.com/nanbuwks/items/594568db3f5dc1d6c5fd

搭載しているマイコンボード

STMマイコンチップをバッジに直接搭載しているのではなく、RobotDyn社の「STM32F103C8T6 STM32 ARM Mini System Dev.board」を使いました。
これをバッジのサブ基板として搭載しています。

image.png

「STM32F103C8T6 STM32 ARM Mini System Dev.board」自体の使い方はこちら
https://qiita.com/lowlevel/items/47b0a8ba17f8afc473a6

回路図、パターン図

image.png
image.png

Pin assaignments

HACK BADGE Discription
BUTTON A PA0 Active High
BUTTON B PC14 Active High
BUTTON UP PB5 Active High
BUTTON DOWN PB6 Active High
BUTTON LEFT PB7 Active High
BUTTON RIGHT PB8 Active High
SPEAKER1 PA10 Active High
SPI OLED D0 PA5 CLK
SPI OLED D1 PA7 MOSI
SPI OLED RES PA3 Reset
SPI OLED DC PA6 DC(Data/Command)
SPI OLED CS PA4 Cable Select
IR RECIEVE PB11 RX3
IR SEND TRIGGER PB10 TX3
IR SEND LED PB0,PB1

シルク印刷のSW-DOWN,SW-LEFT,SW-RIGHT,SW-UPはデタラメです。Sorry!

開発環境のダウンロード

様々な開発環境がありますが、ArduinoIDEを使って開発する場合は以下の通り。

Arduio_STM32 環境構築

  1. Arduino 開発環境をインストールします。
    https://www.arduino.cc/

  2. Arduino_STM32 をダウンロードし、展開します
    https://github.com/rogerclarkmelbourne/Arduino_STM32

    1. 展開したものを、Arduinoフォルダ(後述)の中のhardwareに配置し直します。 (Arduinoフォルダ)/hardware/hardware/Arduino_STM32-master と配置します。
    2. 更に、その中のexamplesにboards.txtという名前の空ファイルを作成します。 (これが無いと起動時に 「.....hardware/Arduino_STM32-master/examplesにboards.txtがありませんでした。1.5以前のものですか?」 というエラーが出る)
  3. Arduino IDEを起動して、<ツール>ー<ボード>ーボードマネージャで「Arduino SAM Boards(32-bits ARM Cortex-M3)」を追加します

Windows

Arduino フォルダ:「ドキュメント」フォルダの中のArduinoフォルダ

また、Windowsのみの作業として、drivers/win/install_drivers.bat を管理者で実行してください。
"install drivers for the Serial and DFU (upload devices)"
ということだそうです。

なお、ST-Linkを使う場合はST-Linkのドライバのインストールも必要となります。
http://www.st.com/ja/development-tools/stsw-link009.html

このページから STSW-LINK009 をダウンロード、インストールしてください。

Mac OSX

Arduino フォルダ:「書類」フォルダ中のArduinoフォルダ

Linux

Arduino フォルダ:/home/<ユーザ名>/Arduino

また、Linuxのみの作業として

http://stm32duino.com/download/file.php?id=1360
から
77-mm-usb-serport-blacklist.rules.tar.gz
ダウンロードして解凍、できた77-mm-usb-serport-blacklist.rulesを
/etc/udev/rules.dに配置する。

これは書込やリセットなどでモード遷移してUSBシリアルデバイスが消えたり現れたりするときに、Linux側の悪いmodemmanagerが悪いことをしてATコマンドを送ったりするのを防ぐもの。

(cf,http://stm32duino.com/viewtopic.php?f=22&t=1892#p25160)

これをしないと、シリアルモニタを開くときに port busy とか言われる。

これは本家のmodemmanagerに付属の77-mm-usb-serport-blacklist.rulesにSTM32の仮想ポートを加えたもの。ArduinoUnoなどの記述も増えているのでこれを使おう。

Test Program

BadgeにはUSB Bootloaderが書き込まれているため、MicroUSBメモリを使って書き込みができます。

方法
image.png

  1. Arduino IDEをセットアップする
  2. バッジとPCをmicroUSBケーブルで接続する
  3. Bボタンを押しながらリセットをする。Bボタンはリセットを離しても2,3秒押しておく
  4. 3.がうまくいくと永続ブートローダーモードになる。永続ブートローダーモードになると青LEDが1秒間に約4回点滅します。
  5. Arduino IDEで以下のようにスケッチ(プログラムのこと)を作り、設定を合わせて書込を行う image.png

以下は永続ブートローダーモードとまぎらわしくなくするため、LEDを脈動するようにしたもの。


void setup() {
  pinMode(PC13, OUTPUT);
}

void loop() {
  int wait=1;
  for ( int i = 1; i < 12; i++){
    digitalWrite(PC13, HIGH);
    delay(wait);
    digitalWrite(PC13, LOW);
    delay(wait);
    wait=wait*2;
  }
}

「ファイル」-「書込設定」で「より詳細な情報を表示する」で「書き込み」にチェックを入れると以下のように書込されます。

image.png

ST-Linkを使って書くやりかた

そのままだと、ブートローダーモードを使ってUSBケーブルで書けますが、操作に失敗してブートローダーを壊したりした場合はST-Linkを使って書き込みます。
配線は以下のようになります。
image.png

ST-Linkを使えば、ブートローダーを使わないスケッチの書込をして起動の早いアプリを作成したり、ブートローダーの復旧などもできるようになります。

ST-Linkを使った場合の書込方法やブートローダの復旧方法などはこちらをご覧ください。
https://qiita.com/lowlevel/items/47b0a8ba17f8afc473a6

Arduinoと違うところ

ポート指定の方法

PC13という名前にしてください。

OLEDディスプレイのプログラムを行うには

こちらを参照してください

https://qiita.com/nanbuwks/items/25ccb1ac38ebb237f94a