TOPPERS 活用アイデア・アプリケーション開発
コンテスト
部門

：

アプリケーション開発部門

作品のタイトル

：

電子おみくじ作成者：

木下浩彰（ファルコン電子株式会社）

共同作業者

：

YI Studio

対象者：

イベント開催者、イベント企画者、展示会出展者

使用する開発成果物：

・TOPPERS/ASP カーネル
Nucleo F401re(GCC)簡易パッケージ(utf8)
・TOPPERS 新世代カーネル用コンフィギュレータ
コンフィギュレータ Release 1.9.6（32bit Linux 用バイナリ）
目的・狙い
当社が展示会で出展した際に、見学者に当社出展ブースへ立ち寄っていただくため、および見学されたお客様との話題作りができるデモ機として開発しました。
当初は景品の抽選機の開発を考えていましたが、Ｗｅｂで抽選についての調査をしたところイベントで「おみくじ」実施している方、興味がある方が多くいることが分かり、利用してもらうことを考えてコンテストに応募しました。

アイデア/アプリケーションの概要
STM32F401RE-NUCLEO で動作します。外付けのＳＤカードから画像データや確率などの設定情報を読み出し、設定された確率と乱数により印刷する画像データを決め、画像データを印刷用に変換処理を行った後、USART で接続されたサーマルプリンタへ画像を印刷します。画像データに「大吉」「吉」などのおみくじとしての文面を含めることで、電子おみくじマシーンとして動作します。ＳＤカード上のデータを変更することで、文面の内容や種類を変更することができます。

１．開発理由
当社ではＲＯＭ書き込みサービスを展開していますが、近年はマイコン内蔵の Flash メモリの書き込みも多くなり、マイコンメーカ様とのお付き合いも多くなってきました。また書き込み内容の確認作業などでマイコンの知識も必要となることから、展示会などでお客様やマイコンメーカ様と接する際に技術力をアピールすることもかねて、マイコンを使ったデモ機を開発し、展示しようと考えていました。
マイコンを使ったデモ機の候補として、ノベリティや粗品を見学者へ渡す際に、「あたり」「はずれ」など見学者の操作により結果が変化するような装置を考え、銀行などの受け付けによく使われている発券機のような装置が作れないか、部品などの調査をしたところ、マイコンに接続可能なプリンタモジュールが電子部品として販売されていることが分かりました。
また、発券機の調査・検討を行っている中で、発券の元祖に「おみくじ」があることに気が付き、「おみくじ」につても併せて調査したところ、イベントで「おみくじ」を作って提供している方、提供したいと考えている方が少なからずいることがわかりました。
このため、開発したデモ機を多くの方々に使ってもらえる可能性を考慮し、「あたり」「はずれ」の単なる抽選機ではなく、マイコンを使った電子おみくじをデモ機として開発しようと考えました。
２．機能、特徴●機能・乱数による抽選結果からＳＤカードに記録されたおみくじ画像を選択し、サーマルプリンタに印刷します。
・抽選の開始は以下の 3 種類を任意に用いることができます。
１）マイコンボード上のユーザボタン
２）外部スイッチ、ＬＥＤが内蔵されていて抽選受付中と印刷中で異なる点滅をします）
３）「おみくじ筒」、筒内に棒が仕込まれ、出入り口のセンサで棒が出たときに抽選・印刷が始まります

ユーザボタン

外部スイッチ

おみくじ筒・ＳＤカードに記録するおみくじ画像は利用者が作成し、おみくじに利用することができます。
画像は用紙幅方向３８４ドット×用紙送り方向１０２４ドットの二値ビットマップ画像が利用できます。
ファイル名は「01gra.bmp」～「20gra.bmp」で、先頭２文字の数字を増やしながら付けていきます。
・おみくじ札は最大２０種類を用いることができます。
・おみくじ札の数は、ＳＤカードに記録されたテキストファイル（num.txt）を編集することで変更できます。
num.txt
5（おみくじ札が５種類の例）← 「1」～「20」まで設定可能

・おみくじ札の抽選確率は、ＳＤカードに記録されたテキストファイル（prob.txt）を編集することで変更できます。
確率は、（各おみくじ札の発生数）÷（おみくじ札全体の発生数の合計）となります。
prob.txt（おみくじ札が５種類の例）

2←

おみくじ札 01 の発生数（対応するおみくじ札画像のファイル名は、01gra.bmp）

10←

おみくじ札 02 の発生数（対応するおみくじ札画像のファイル名は、02gra.bmp）

5←

おみくじ札 03 の発生数（対応するおみくじ札画像のファイル名は、03gra.bmp）

2←

おみくじ札 04 の発生数（対応するおみくじ札画像のファイル名は、04gra.bmp）

1←

おみくじ札 05 の発生数（対応するおみくじ札画像のファイル名は、05gra.bmp）●特徴・プログラムを再ビルドすることなく、ＳＤカード上の画像を変更することで印刷する文言を変更できます。
・画像の作成、加工は Windows に標準でインストールされている「ペイント」で行うことができ、特殊なツールを用意する必要がありません。

ペイントで作成中の画面

印刷結果 ※１

・文字フォントは利用者のＰＣに入っているフォントを利用することができます。
・ペイントを用いるので文字以外に画像も含めることができます。
・おみくじのほか、アタリ／ハズレ、松／竹／梅などの抽選発券機として利用することもできます。

・おみくじ札の印刷長を、ＳＤカードに記録されたテキストファイル（len.txt）を編集することで短く変更することができます。
数値は１行８ドットの行数で、３の倍数に設定する必要があります。
len.txt
96（上記※１のおみくじ札の例）

３．開発環境●ハードウェア
マイコンボード

STM32F401RE NUCLEO
http://akizukidenshi.com/catalog/g/gM-07723/
EH601 or SparkFun COM-10438

サーマルプリンタ

http://www.aitendo.com/product/16099
https://www.sparkfun.com/products/10438

ＳＤカードソケット
ＳＤカード
フォトインタラプタ

aitendo: 2P-SD-88
http://www.aitendo.com/product/13092
通常市販品（試作機では Class4/4GB カードほかを使用）
CNZ1023(ON1023)
http://akizukidenshi.com/catalog/g/gP-09668/

外部スイッチ

百円均一

ＬＥＤ照明を改造

トランジスタ2SC1815

抵抗１００Ω×２、１０ＫΩ×７●ソフトウェアＲＴＯＳ

コンフィグレータ

TOPPERS/ASP Nucleo F401re(GCC)簡易パッケージ(utf8)
https://www.toppers.jp/download.cgi/asp_nucleo_f401re_gcc-20160219.zip

Release 1.9.6（32bit Linux 用バイナリ）
https://www.toppers.jp/download.cgi/cfg-linux-static-1_9_6.gz

ＢＳＰ

ST マイクロサンプルコード／STM32CubeF4(Board Support Package)

http://www.st.com/ja/embedded-software/stm32cubef4.html

ファイルシステム

FatFs

コンパイル環境

ＰＣ Ｌｉｎｕｘ

ｘ８６版

GNU ARM Embedded Toolchain
コンパイラ

5-2016-q3-update/Linux 32-bit

https://developer.arm.com/-/media/Files/downloads/gnu-rm/5_42016q3/gcc-arm-none-eabi-5_4-2016q3-20160926-linux.tar.bz2

４．ハードウェア構成●モジュール構成
おみくじ筒
STM32F401RE NUCLEO
サーマルプリンタ

GPIOUSARTGPIOSPI
外部スイッチ

5V AC アダプタ

ＳＤカードソケット／ＳＤカード

●回路図

５．ソフトウェア構成●ディレクトリ構成|-- Data1

ＳＤカードのサンプルデータ（おみくじ札）||-- Data2

ＳＤカードのサンプルデータ（アタリ／ハズレの抽選用）||-- asp

TOPPERS/ASP カーネル|`-- omikuji|-- Makefile

configure 自動生成ファイルを改造|-- fatfs||-- cc932.c

fatfs 流用||-- diskio.hfatfs 流用||-- ff.cfatfs 流用||-- ff.hfatfs 流用||-- ffconf.h

fatfs 流用||-- get_fattime.c新規：時間取得ダミー処理||-- integer.hfatfs 流用||-- mmc.cfatfs 流用||-- spi.c

新規：STM32F401RE nucleo SPI アクセス処理|`-- spi.h

新規：STM32F401RE nucleo SPI アクセス処理|-- main||-- dev_access.c

新規：STM32F401RE nucleo ポートアクセス処理||-- dev_access.h

新規：STM32F401RE nucleo ポートアクセス処理||-- omikuji.c

asp/sample/sample1.c 流用：おみくじの各タスク処理||-- omikuji.cfg

asp/sample/sample1.cfg 流用|`-- omikuji.h

asp/sample/sample1.h 流用|-- printer||-- dev_uart.c

新規：STM32F401RE nucleo UART アクセス処理||-- dev_uart.h

新規：STM32F401RE nucleo UART アクセス処理||-- printout.c

新規：プリンター出力処理|`-- printout.h

新規：プリンター出力処理`-- utils|-- WaitMsec.S

新規：微小時間待ち|-- WaitNsec.S

新規：微小時間待ち`-- WaitUsec.S

新規：微小時間待ち●タスク構成
電子おみくじは４つのタスクで構成されています。
タスク名

内容
入り口関数：main_task()
プライオリティ：５
システムの起動処理とイベント処理を行う。
各デバイスの初期化後の電源投入直後のユーザボタンの状態を確認し、オフならノメインタスク

ーマルモード、オンならデバッグモードを変数へ記録する。以後、ユーザボタンへのアクセスはトリガータスクのみが行う。
ＳＤカードからデータ数、発生率、印刷長を読み出し、変数の初期化を行う。
初期化完了後に他タスクを起動してイベント待ちへ入る。
（現在は処理するイベントがないため、tslp_tsk()を無限に繰り返す）
入り口関数：omikuji_print_task()
プライオリティ：１０
データの抽選と抽選結果の印刷を行う。
タスク開始後、乱数列を進めながら tslp_tsk()を繰り返し、トリガータスクからの印刷要求を待つ。

プリントタスク

印刷要求を受けると乱数値を取得し、発生率テーブルから印刷するデータ番号を決め、対象となる画像データをＳＤカードから読み出す。
読み出したビットマップデータのヘッダ部分を読み飛ばし、画像部分のデータを印刷用メモリへ展開後、USART 経由でプリンタへ出力する。
印刷中にキャンセル要求を受けたらその時点で印刷を完了する。
印刷完了後、印刷要求をクリアし、再び印刷要求を待つ。
入り口関数：omikuji_led_task()
プライオリティ：９
装置の状態によりＬＥＤの点灯や点滅処理を行う。

ＬＥＤ制御タスク装置の起動状態の確認を行い、ノーマルモードなら１秒周期の点滅、デバッグモー
ドなら０．５秒周期の点滅となるよう設定する。
乱数列を進めながら設定された周期での点滅を繰り返す。
トリガータスクからの印刷要求を検知したら点滅を０．２秒周期へ変更する。
印刷要求がクリアされたら、１秒周期、もしくは０．５秒周期の点滅へ戻す。
入り口関数：omikuji_trigger_task()
プライオリティ：９
抽選のトリガーとなるスイッチなどのポートの監視と他タスクへの通知を行う。

トリガータスク

ユーザボタン、外部スイッチ、おみくじ筒の状態を tslp_tsk()しながら監視する。
ユーザボタン、外部スイッチ、おみくじ筒のいずれかの状態が変化したら印刷要求をセットし、おみくじ筒の状態変化を監視対象から外す（マスクする）。
印刷中にユーザボタンか外部スイッチが押されたらキャンセル要求をセットする。
印刷要求がクリアされたらおみくじ筒のマスクを解除し、監視処理へ戻る。

６．使用法、動作状況（１）起動方法
データが記録されたＳＤの挿入、外部スイッチなどの接続を確認後、ＡＣアダプタを接続します。

（２）操作方法
外部スイッチ、またはマイコンボード上のユーザボタンを押すことでマイコン内部で抽選が行われ、印刷が開始されます。

用紙のカットは用紙排出部の上端を使って、手動で行います。

ＳＤカードの画像データや確率設定などを変更することで、おみくじの内容を変えたり、おみくじ以外の抽選機として使うことができます。

以下のＵＲＬで動作動画を見ることができます。
<https://youtu.be/Nw5aRv8T1yE>７．最後におみくじを引くという機能に関しては目的を達成できたと思います。
ただ現時点では試作機という位置づけでケースやおみくじ筒は展示会のデモとして使うときまでにはもう少し見栄えのする器に収めなければと思います。
また、抽選に関しては設定された発生率に従って、ランダムに結果を出力していますが、１等賞、２等賞など賞品の数が定まっているような場合には利用できないため、今後は数量を限定できる機能も加えていろいろな抽選が行える抽選機としていきたいと思いました。
付加的な機能としてデバッグ用のＰＣが接続できる環境では、UART を経由してシリアルコンソールにシスログが出力できるので装置の状態などを把握できますが、装置単体ではどのような状態になっているのか把握が容易ではありません。今回使用した STM32 の NUCLEO ボードでは Arudino 配置のコネクタがあり、電子おみくじでは Arudino 配置のコネクタの多くは使用せずに空けてあるので、ＬＣＤなどの拡張ボードを接続することで装置の状態や利用者へ操作を促すようなメッセージの出力ができるようにもしていきたいと思いました。

８．補足
当開発では、使用するサーマルプリンタとして以下の 2 種類の利用を考えていましたが、提供する回路図、プログラムでは「SparkFun COM-10438」のみが利用可能であることが判明しました。
・SparkFun COM-10438
・EH601「EH601」を利用するはシリアル通信信号の電気レベル、および、通信速度を変更しなければならず、このため、回路図、ソフトウェアに対して以下の修正が必要となります。
●回路図の修正箇所
シリアル通信の電気レベルを EH601 に合わせるため、「USART6-TX」「USART6-RX」とプリンタとの間にＲＳ－２３２ＣドライバＩＣを入れます。

●ソフトウェアの修正箇所
シリアル通信の通信速度を１９２００ｂｐｓから９６００ｂｐｓへ変更します。
\omikuji\printer\dev_uart.c ９行目#define

UART_RATE19200↓#defineUART_RATE

9600以上