Monthly Archives: March 2019

Raspberry Pi Mouse 研修[5]

こんにちは。seyaです。

今回は、c++でラズベリーパイマウスのドライバへの書き込み、読み込みのプログラムを書きました。

マニュアルに載っているopen,close,writeはc++で使用できなかったので、cstdioライブラリのFILE構造体、fopen, fclose, fprintf,fscanf,fgetcを使用していきます。

ドライバへの書き込み(読み込み)は以下の順序で行いました。

  1. FILE構造体を定義する
  2. fopenで、/dev/rt~ を書き込みで開く
  3. fprintf(fgetc)で書き込み(読み込み)を行う
  4. fcloseでプログラムからファイルを閉じる

Lチカ、スイッチ入力のサンプルプログラムは以下の通りです。

sample program(lチカ、スイッチの入力)

次回やること

今後のプログラムではオブジェクト指向を取り入れていきたいと考えています。

次回以降は、周辺機能をクラスにまとめていきたいと思います。

 

続きを読む ›

Posted in Raspberry Pi Mouse


マイクロマウスクラシック~プラスチック壁について~

こんにちは、まえけんです。

ただいまアールティではマイクロマウスクラシックサイズの
プラスチック壁の開発をしております!

現在、弊社webショップでは木製の壁を販売しておりますが
昨年販売を開始した柱に引き続き、壁もプラスチック化を進めております。

販売はもう少し先になりますが、形になってきましたので情報を公開していきたいと思います。

手前側がプラスチック壁で、奥側が木製の壁になります。
壁をひっくり返すとわかりやすいですね。
近くで見るとこんな感じになっています。
上から見るとこんな感じです。左と下がプラスチック壁で、右側が木製の壁になります。

作りたてで見た目が綺麗なのもいいですね!
また新たな情報が入りましたらこちらで更新していきます!

続きを読む ›

Posted in お知らせ, ブログ


マイクロマウス研修 Part8.1(番外)(岩本)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

マイクロマウス研修(岩本)一覧
Part1Part2Part3Part4Part5Part6Part7Part8

番外
Part8.1

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

こんにちは岩本です。
今回はサンプルプログラムSTEP3で行ったプログラムについて、もっと簡潔なプログラムの書き方を知ったのでそれについてです。
Part8で下図のプログラムの説明を行いましたが、プログラマーの人たちから見るとこの制御文は長すぎるそうです。

 

今回説明する計算方法は、トグルという計算方法です。
トグルを使用すると、0と1を交互に入力する式を簡単に作ることが出来ます。
今回のLEDにこれを当てはめると、下図のようになります。
上図47行目から54行目と同じ結果が、下図47行目の1行で表すことが出来ますし、変数state_rの宣言も必要無くなります。

 

しかし、”^”(ハット)とは何でしょう?
これは、Part8でも少し登場しました”&”と同じビット演算子の1つです。
2つの値があり、どちらか片方だけ1なら1、どちらも0またはどちらも1の場合は0を返します。
概ねaとbをそのまま、足し算している感じですね(1+1は0になりますが)

 

でも47行目の式は”^=”となっていますね
これは、複合代入演算子と言い、式が省略されている物です。

 

続きを読む ›

Posted in Pi:Co Classic3 製作記


Raspberry Pi Mouse 研修[4]

今回は足立法の実装を行いました。

足立法の解説はマイクロマウスの競技に参加している方のブログや、弊社のblogのマイクロマウスのアルゴリズムについて①等にたくさんのっているので、そちらを見てみてください。

c++には、標準のライブラリでキューがあったので、キューを使用した歩数マップの更新のプログラムを書きました。

maze

足立法の次の動作を決める関数は空白にしたので、各自考えてみてください。

次の動作を決める関数を実装することでCUI上で、マウスがゴール座標に到達するまでのシミュレーションを動かすことができます。

また、mazeクラスのshow関数を使用することで壁情報の表示を行うことができ、CUI上でシミュレーションをすることもできるようにしました。

 

次回やること

ハードウェアのプログラムに戻り、周辺機器の設定プログラムを書いていきます。

 

 

 

続きを読む ›

Posted in Raspberry Pi Mouse


マイクロマウス研修(kora編)[19] 新機体の設計

こんにちは。koraです。

今回は新機体の回路設計です。オープンソースの電子回路設計ソフトKiCadを使用します。

回路図作成

まず、新機体で使用するレギュレータやジャイロセンサなどの電子部品を考えます。HM-StarterKitの回路図はアールティのGitHubで公開されているので参考にします。新機体で使用する電子部品が決まったら、KiCadの回路図エディタ(Eeschema)を起動して、シート上へ配置します。

マイコンにはSTM32を使用するので、マイコン周りの配線はNUCELOの回路図を参考にします。プログラムの書き込み方法も考えて配線します。書き込みについてはGetting started with STM32F7 Series MCU hardware developmentに書かれています。STM32F7シリーズではリセット時にBOOTピンをHIGHにしていれば、ブートローダが起動してプログラムを書き込めるようになるそうです。UARTで書き込む場合は、USART1とUSART3が使用できます。

作成した回路図がこちらです。

基板レイアウト作成

今度はKiCadのプリント基板エディタ(Pcbnew)を起動します。Eeschemaで作成した回路図をネットリストというファイルにエクスポートして、Pcbnewに取り込みます。また、DXFファイルをインポートすることもできるので、CADで作成したマウスの形状をそのまま再現することができます。

さっそく部品を配置してみましたが…マイコンの右側のピンが基板の左側に伸びていたりして全部の配線を繋げることができませんでした…。

Eeschemaに戻ってマイコンのピンアサインからやり直します。というわけで戻って修正した回路図と基板レイアウトがこちらです。

Pcbnewには3D Viewerもついています。直感的に確認できますし、なによりモチベーションが高まるので嬉しいです。

次回

いかにもマウスっぽい基板レイアウトができましたので、次回はこれをプリント基板メーカーに発注したいと思います。

続きを読む ›

Posted in DCマウス研修


マイクロマウス研修 Part8(岩本)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

マイクロマウス研修(岩本)一覧
Part1Part2Part3Part4Part5Part6Part7、Part8

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

こんにちは岩本です。
今回はサンプルプログラムSTEP3の中身を確認していきたいと思います。

まずは、メインプログラムの確認からです。
STEP3_Switchのメインプログラムは下図のような感じです。
33~36行目は、状態を表すための変数の宣言及び代入。
38行目でPart6でも行った各機能の初期化。
41行目while(1)で42~82行目までを無限ループさせています。
43行目のwhileで44行目から56行目をループさせています。()の中身はループを抜け出す条件です。
()内の”&”は、ビット演算子の一つでビットANDと言い、ビットで計算させる方法です。例えば、0&0の答えは0、0&1は0、1&1の時のみ1となります。
プログラムだけ見ていると少しわかりにくいのですが、SWの値はスイッチを押していないときは1(3.3V)、押しているときは0(0V)が出力されます。(教科書14P・20P参考
このような抵抗の使い方をプルアップ抵抗といいます。
そのため、スイッチを押していないときはWhileの中は1(true)となり、無限ループが発生します。しかも、実行文が無いため、何もしなければ43行目から抜け出せません。
逆にスイッチを押した場合は0(false)となり43行目から抜け出すことが出来ます。
ループから抜け出せたら、どれかのSWが押されたことになりますので、45行目・58行目・71行目の対応するif文が読み込まれます。
例えば、45行目のif文でSW_Rが押された場合の動きとしては、47行目でstate_rに1を足しています。”++”はインクリメント演算子と呼ばれ、変数の値に1を足します。
48行目でstate_rが1より大きくなっていた場合0に戻す処理を行っています。
50行目・53行目でstate_rの値が0か1で、LEDを光らせるかどうかを決めています。
84行目・88行目はチャタリングを除去しています。(教科書20P
これは、スイッチを押した瞬間に瞬間的にoffになり、その後再度ONになった場合、2回スイッチが押された判定になってしまいLEDが光らなくならないようにするための処置です。
86行目は、43行目のwhile文と似ていますが、()内の最初に”!”が付いています。これは論理演算子の一つで、”~ではない”という意味になります。
スイッチを押し続けている間は(SW_R & SW_C & SW_L)の値は0となりますが”!”があるため、”0(false)ではない”(=”1(true)”)という答えになります。つまり、SWを離すまで無限ループになります。

 

ちなみに、 SW_ R・SW_ C・SW_ Lは、portdef.hの中で定義されています。

 

続きを読む ›

Posted in Pi:Co Classic3 製作記


shotaのマイクロマウス研修13[回路設計①]

こんにちは、shotaです。

社員研修として、オリジナルマウスの製作を始めます。

[前回の記事]ではオリジナルマウスの設計方針を決めました。[HM-StarterKit(通称ハムスター)]の回路を流用して、設計時間を短縮するということでした。

今回から回路設計を始めます。

 

マウスの回路ブロック図

まずはじめに回路ブロック図を作ります。

回路ブロック図を書くと、システムに必要な回路要素(ブロック)を把握でき、要素間の接続も確認できます。

各ブロックに使用する素子・ICや、接続する電源電圧等を書いておくとより便利です。

 

今回は簡易的な回路ブロック図を作成しました。

[ハムスターの回路図]をベースにしていますが、マイクロマウスとしてはベーシックな回路構成になっていると思います。

(最近では[吸引ファン]を取り付けるのが流行ってるみたいです)

 

このブロック図について簡単に説明します。

  • バッテリ・電源コネクタ・電源回路
    • マイクロマウス(というか回路)を動かすには電源が必要です。
    • [マイクロマウス(ハーフサイズ)競技規定]より、マウスの大きさに制限があるため、ACアダプタによる電源供給は難しそうです。
    • 競技規定より、燃焼を利用したエネルギー源は許されないので、残念ながらエンジンは搭載できません。
    • 以上より、比較的サイズの小さいLiPoバッテリを使います。
  •  マイコン回路
    • 競技規定より、マイクロマウスは自立型でなければなりません。そのためには頭脳となるマイコンが必要です。
    • マイコンにはESP-WROOM-32Dを使用します。
  • モータドライバ・エンコーダ・DCモータ
    • 迷路を走行するためにはタイヤとモータが必要です。モータを動かすためにはモータドライバが必要です。
    • また、走行速度や走行距離を推定するためにはエンコーダが必要です。
    • 競技規定より、迷路の壁を飛び越したり、 よじのぼったりしてはいけいないので、残念ながらジャンプ機構は搭載できません。
  • 物体検出センサ回路
    • いわゆる壁センサです。
    • 迷路の壁を検出し、マウス自身の位置や姿勢を推定するために必要です。
  • モーショントラッキング回路
    • マウス自身の位置・速度・姿勢を推定するために必要です。
    • 加速度センサ・ジャイロセンサを搭載します。
  • インジケータ回路
    • プログラムの状態を表示するために必要です。
    • LEDを搭載します。
  • ソフト書き込みコネクタ
    • マイコンにプログラムを書き込むために必要です。
    • 回路規模の縮小のためコネクタを用意せず、基板に導線をハンダ付けしてプログラムを書く方法もあります。
      • 毎回毎回ハンダ付けするのは手間がかかるので採用しません。

マウスの回路図

そして・・・出来上がった回路図がこちらです。

次回から、各回路ブロックについて説明します。

 

続きを読む ›

Posted in DCマウス研修, ブログ, 研修


Raspberry Pi Mouse 研修[3]

こんにちは。seyaです。

今回は、迷路の壁情報の保存のプログラムをc++で書いてみました。

壁情報の保存の仕方は、クラシックマウスの迷路が16*16マスあることから縦、横がそれぞれ17こあるという考え方をもとに行いました。

縦、横壁の一次配列を2つ作成し、それぞれの配列の変数のビットに壁情報を保存するという方法をとりました。この方法の問題点は、プログラムをぱっとみたときにわからないということがあります。

なぜこの方法をとるかというと、マイクロマウス競技で使用されているマイコンではメモリをふんだんに使うことができないため、メモリの節約を意識したプログラムを書くことが多いです。

今回は、メモリを意識(?)してみました。

ソースコードは以下の通りです。

上から順に迷路で使用する変数を書いたヘッダファイル、マップ情報を保存するためのヘッダ、ソースコードです。

maze_conf.h

map

ここに挙げたソースコードでは、表示ができませんが、表示をすると下記の写真のようになります!次回以降に表示方法を書いていきたいと思います!

ソースコードを書いてから気づきましたが、ラズベリーパイのメモリはふんだんにあるので気にする必要がそこまでなかったような気がします。

メモリを意識しないでロボットを動かすためのソースコードをかけるのはいいですね!

 

次回やること

今回のマップ情報を使用して、マイクロマウスの迷路探索アルゴリズムでよく使用される足立法の実装を行う!

 

 

続きを読む ›

Posted in Raspberry Pi Mouse


マイクロマウス研修(kora編)[18] 新機体の構想

こんにちは。koraです。

前回まではHM-StarterKitで迷路探索を行っていましたが、今回からは新機体の作成に入ります。

昨年の全国大会では、マイクロマウス競技(旧ハーフサイズ)のセミファイナルに参加し、完走することができました。
マイクロマウスがどういうものかだんだんと理解が深まってきたので、いよいよハードウエアから自作して今年の大会に出場したいと思います。

変更点

新機体の構想ですが、マイクロマウス競技のファイナル(32×32マス)に挑戦するため、HM-StarterKitをベースにしつつ以下の変更を加えます。

  • 変則四輪にして加速性能と直進性能を上げる。
    二輪に比べ、タイヤにかかる垂直抗力が低下しにくくなるので加速度を上げることができます。また、ハードウェア的に旋回しにくい構造のため直進性能も向上すると考えられます。旋回が難しくなるというデメリットはありますが、そこはパラメータの調整を頑張って対応していきたいと思います。
  • 処理能力の高いマイコンを使用して大きな迷路に対応する。
    STM32F732を搭載して処理能力を向上させます。動作周波数は約2倍、RAM容量は約4倍になります!(一方、パッケージも大きくなるのでハーフサイズの機体に載せるにはちょっと辛いですが…)
  • 壁検知しやすい光センサに替える
    HM-StarterKitの光センサは、取り付けの安定性を重視して赤外線LEDとフォトトランジスタが一体になったフォトリフレクタ(LBR-127)が使用されています。新型機では壁検出性能を上げるため、よりビーム角度の狭いLED(OP265AD)と、より立ち上がりの早いフォトトランジスタ(LTR-4206)を使用します。

以上の変更点を考慮して、3D CADで形にしてみたものがこちらです。車輪が増えた分だけ前後に伸びたHM-StarterKitというような感じです。

次回

それでは次回から、回路CADの使い方を学びながら新型機の回路設計を開始します。

続きを読む ›

Posted in DCマウス研修


マイクロマウス研修 Part7(岩本)

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

マイクロマウス研修(岩本)一覧
Part1Part2Part3Part4Part5Part6、Part7

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

こんにちは岩本です。
今回はサンプルプログラムSTEP2の中身を確認していきたいと思います。

まずは、メインプログラムの確認からです。
init_allで初期化した後、BUZZERを1と0で鳴動を制御し、間に時間待ち時間を作っているようです。
あれ、Part5でLED光らせるのととほぼ一緒ですよね。

 

そういえば、Part5のdefineですでにBUZZER定義されていましたね。

 

それにinit_allの中もPart6でinit_ioの設定でブザーポートの初期化も含まれていましたね。

 

ということで他は殆どSTEP1と同じなのでSTEP2ブザーは終わりです。めちゃ早かった。

続きを読む ›

Posted in Pi:Co Classic3 製作記