Nov11’s diary(自宅での開発環境作り )

3Dプリンタと切削加工機で工作した事をアップして行きます

PICを使用して開発する事にした(8BitMCUのPIC16Fを使用する)

STMicroelectronicsさまのレーザー測距センサ(VL53L0X)をPIC32MX170F256Bを使用して、距離測定が出来るようになったのは良かったのだが、ロボットアームの全長が30cm以上あるので、ケーブル長が40cm以上になってしまう
この長さをI2Cでやり取りするのは難しそうなので、UARTでロースピードで伝送する方式にする事にしようと考えたのだが、PIC32MX170F256BやPICFJGA002は、28ピンもありサイズが大きいので、サイズの小さい8bitMCUのPIC16F1455を使用する事にした
PIC16F1455を選択した理由は、14ピンで、コンパクトな上に、EUARTやI2C(MSSP)通信の他にA/DやD/A変換等の機能が盛り沢山な上に価格も160円(秋月)とコスパがとても良い、またコードコンフィグレータ(MCC)が使用できるので、プログラムを作成も簡単に出来てしまいそうなので、採用する事にした

PICを使用して開発する事にした(32BitMCUのPIC32MX系を使用する)で、xc8のコンパイル環境をインストールしていたので、PIC16F1455の資料を以下のサイトからダウンロードして、動作テストを行う事にした

PIC16F1455のマニュアル

http://ww1.microchip.com/downloads/en/DeviceDoc/40001639B.pdf

MPLAB X Code Configurator ユーザガイド

http://ww1.microchip.com/downloads/jp/DeviceDoc/40001725B_JP.pdf

んで、PIC16F1455のマニュアルから、PICkit3とPIC16F1455を接続して、MPLAB X Code Configuratorユーザガイドを見ながら設定とプログラムを作成を行った
それにしても、8Bit系のPIC16やPIC18のコンパイラやコードコンフィグレータ(MCC)の日本語マニュアルがあるのとても嬉しいですね(16/32Bit系のマニュアルは見つけられなかったです...)
そのおかげで、悩む事無くサクッと簡単にプログラムを作成出来ました!!
また、PIC16Fは、コールバック関数を登録できるので、プログラム修正しなくて良いのがいいですね

作成したプログラムは、テラターム経由で、PIC16F1455のD/A変換でLEDの明るさを変えながら、タイマー割り込みを使用して、LEDを点滅させるものです
テラタームやFTDI等の設定やプログラムの書き込みは、「PICを使用して開発する事にした&三日坊主にならずに済んだ!」を参考にしてください

〔PICkit3とPIC16F1455の接続図〕

f:id:Nov11:20170124155420j:plain

〔PICkit3とPIC16F1455の接続写真〕

f:id:Nov11:20170124155445j:plain

〔PIC16F1455の設定〕

f:id:Nov11:20170124155521j:plain

f:id:Nov11:20170124155540j:plain

f:id:Nov11:20170124155602j:plain

f:id:Nov11:20170124155622j:plain

f:id:Nov11:20170124155646j:plain

f:id:Nov11:20170124155717j:plain

f:id:Nov11:20170124155735j:plain

f:id:Nov11:20170124155751j:plain

 

〔PIC16F1455のプログラム〕
//------------------------------------------------------------------
//------------------------------------------------------------------
// TMR1 CallBack Function
void LedToggle( void ) {
     // この関数が500mSec間隔でコールされる
     IO_LED_Toggle();
}

void main(void)
{
     uint8_t ucChar;
     uint8_t ucLevel = 0;
     // initialize the device
     SYSTEM_Initialize();

     // Interrupt Enable
     INTERRUPT_GlobalInterruptEnable();
     INTERRUPT_PeripheralInterruptEnable();

     // TMR1 CallBack Function Entry
     TMR1_SetInterruptHandler( LedToggle );
     // DAC Output
     DAC_SetOutput( ucLevel );

     while (1)
     {
          // Add your application code
          ucChar = EUSART_Read();
          if ( ucChar == 'u' ) {
               if ( ucLevel < 0x1f ) {
                    ucLevel++;
               }
          }
          if ( ucChar == 'd' ) {
               if ( ucLevel > 0 ) {
                    ucLevel--;
               }
          }
          // DAC Output
          DAC_SetOutput( ucLevel );
          // Echo Back
          EUSART_Write( ucChar );
     }
}
//------------------------------------------------------------------
//------------------------------------------------------------------

プログラムを書込んだ後に、LEDが0.5秒毎に点滅し、コンソールから'u'を入力すると、もう一つのLEDが明るくなり、'd'を入力すると暗くなる事が確認できれば、動作テスト完了となる

 

これで、I2C通信を確認して、VL53L0Xの制御シーケンスを乗せれば、ロボットアームに組み込む事が出来そうです

なお、ブログの内容を参照して実行した結果に責任は負いかねますので、ご了承下さい

 

 

自作したロボットアームを制御する(現実認識を行う)(その4)レーザーで距離を認識する

前回使用したHC-SR04だと、±1cm程度の誤差が発生してしまう事が判明したので、他の距離センサを探した結果、レーザー測距センサのVL53L0Xと言う物を見つけた
ネットの評判は、とても良さげで、なんと測定誤差が±1mmで、I2Cで制御出来るとの事なので、早速購入して試してみた
が、残念な事に、このモジュールは、通常のI2Cモジュールみたいに簡単制御出来ない!
制御する為には、ライブラリーが必要なのだが、残念な事にPIC用のライブラリーは用意されていない
ん~、勢い任せで購入したが、もしかしたら、1500円が無駄になる可能性が…
焦りながら、色々と調べると、ライブラリーはソースで供給されているみたいなので、メーカさま(STMicroelectronics)のサイトを見てみると、ソースコードがありました!!
んで、早速ダウンロードして、I2Cの部分のみ記述を変えてコンパイルし、以前作成した液晶コントローラー(2016/01/29)のMCUをPIC32MXに乗せ換えた環境で動作させたのだが、さっぱりと動いてくれない
ロジックアナライザを取り出し確認したところ、I2Cコマンド発行間隔に数ミリ程度空けないといけない事が分かったので、この部分を修正して、動作させると、動いてくれました(1500円が無駄にならずにすみましたぁ~)
ついでに、対象物検知や測定結果を読み上げてくれるように、以前作成した音声合成モジュール(2016/02/09)を接続して、動作確認をして見たが、なかなか良い感じに動いてくれた

これで、ロボットアームに取り付けるモジュールがそろった!
後は、音声認識が出来るようにして、音声対話プログラムを作成すればってところですね

[測定写真]

f:id:Nov11:20170110104811j:plain

          (VL53L0Xと飛行機の距離を測定しています)

[測定動画]

youtu.be

       (VL53L0Xと飛行機の距離を測定しています)

 

 

なお、ブログの内容を参照して実行した結果に責任は負いかねますので、ご了承下さい

 

自作したロボットアームを制御する(現実認識を行う)(その3)音波で距離を認識する

OpenCVVisual studio C++を使って、形状や文字を認識できる様になったので、物体までの距離を測定し、実際の大きさやロボットアームの位置補正などが行える様にする為に、距離センサのHC-SR04を使用し距離を測定してみた
距離センサのHC-SR04の制御はとても簡単で、電源に5V掛けて、トリガー端子に10μSecの信号を入れるとエコー端子に、距離に応じたパルスが入ってくるお手軽簡単モジュールとなっている
んで、アマゾンさまで、3個セットで799円で売っていた物を購入して、モジュール基板のシルク印刷通りに配線を行い、ロジックアナライザで測定した結果、以下の様になった

[結果結果]

f:id:Nov11:20161122011239j:plain
[測定写真]

f:id:Nov11:20161122011416j:plain


結果としては、まずまずなのだが、ネットで公開されているものよりは、良くないような…?
測定環境により、多少の誤差はある様な感じってところですかね
とりあえず、ミリ単位の測定は難しそうだけど、全体的な測定を行う事は出来そうなので、人感センサーの代わりに使用したり、ざっくりなエコーロケーションとかにも良いかもですね

しかし、ロボットアームのキャリブレーション様には難しそうなので、他を探す事しよう

なお、ブログの内容を参照して実行した結果に責任は負いかねますので、ご了承下さい

 

PICを使用して開発する事にした(32BitMCUのPIC32MX系を使用する)

ロボットアームに取り付けるカメラ制御が出来たので、距離センサなどの制御を行う事にしよう思い、久しぶりにPICでの開発を再始動しようとしたが、MPLAB Xが、インストールされていない!
そうだ!、Windows8から、Windows10にアップデートする時に、パソコンを初期化したので、PICの開発環境をきれいさっぱりと消してしまった事を思い出した
と言うことで、PICの開発環境(MPLAB X)をインストールする事にした

「PICを使用して開発する事にした&三日坊主にならずに済んだ!」を参考に以下をインストール

 MPLABX-v3.45-windows-installer.exe
 xc8-v1.38-full-install-windows-installer.exe
 xc16-v1.26-full-install-windows-installer.exe
 xc32-v1.42-full-install-windows-installer.exe
 (2016年11月8日時点)

んで、インストールした後に、Code Configurator(MCC)をPluginしたら、ずいぶん画面が変わっている
確認したら、バージョンが、「v2.25.2」から「v3.25」と、ずいぶんバージョンアップしている
少し困ったのが、「v2.25.2」で作成したプログラムを「v3.25」で修正する事が出来ない

これでは、過去に作成したプログラムをメンテナンス出来ないので、以下の手順で複数のバージョン切り替えが出来るようにしてみた

1)コードコンフィグレータのnbm(NetBeansモジュール)をダウンロードする
  http://www.microchip.com/mplab/mplab-code-configuratorアーカイブから、
  com-microchip-mplab-modules-mcc-2.25.2.nbmをダウンロードし、適当な場所に解凍しておく
2)MPLAB Xにインストールする
  MPLAB Xを起動する
  [Tools]メニューから[Plugins]を選択すると画面が開くので、
  [Download]タグを選択し、[AddPlugins]を押し、nbmファイルを指定し、
  説明に従いインストールを行う
3)バージョンを選択する
  MPLAB Xを再起動し、[Tools]メニューから[Embedded]を選択する
  [MPLAB Code Configurator]が追加されているので、これを選択する

以上で、過去に作成したプログラムをメンテナンス出来る様になった

また、今回のCode Configurator(MCC)を確認していたら、32Bit系のPIC32MXも使用できる事に気付いた
[pic32mx_v1.00.ja]ファイルを確認すると、PIC32MX系とPIC32MZ系までが使用可能なので、一番容量が大きくて使い易そうな、PIC32MX170F256Bを使用し、色々と開発する事にしてみた
(本当は、PIC32MZ系を使用してみたいけど、軍事転用可能で国外取引には審査が必要なので後日検討する事にしました)

PIC32MX170F256Bは、PIC24FJ64GA002と比べて、とてもコストパフォーマンスが良い!
[Output Compare]は、内蔵されていないみたいだけど、速度も容量も何倍に増えて、お値段は500円以下と、とても、とてもお買い得な物になっているし、何よりプログラム容量が256Kbyteはありがたい
が!、マニュアルが英語版しか見つからない!
英語と数学を避けて、図画工作系の技術者になった筆者には、少し辛いが見つからない物は仕方ない

以下のサイトより、リファレンスマニュアルをダウンロードして調べる事にしたが、マニュアルのページ数は、2つ合わせて1500ページ近くもあるので、気合と根性が試される事になった
しかし、このページ数は病人じゃなくても病人になりそうだ(あくまでも、個人の感想ですよ)

http://www.tme.eu/en/Document/5d4fa517ccd831b6a5c79ea5c7266851/pic32mx1xx_2xx.pdf

http://hades.mech.northwestern.edu/images/2/21/61132B_PIC32ReferenceManual.pdf

んで、マニュアルを読んだ(気合も根性が足りずに斜め読みになってしまった…です)結果、PIC24FJ64GA002と同じ接続方法で良い事が判明(I2Cを除く)したので、PICkit3を使って、動作確認を行う事にしてみた
接続などは、「PICを使用して開発する事にした&三日坊主にならずに済んだ!」を参照する

〔PICkit3とPIC32MX170F256Bの接続写真〕

f:id:Nov11:20161108232504j:plain


〔プログラム作成〕

1)MPLAB Xを起動し、スタートガイドに従いプロジェクトを作成する
 Select Deviceで、[32-bit MCUs (PIC32)]、[PIC32MX170F256B]を設定する
 Select Toolで、[PICkit3]を選択する
 Select Compilerで、[XC32]を選択する

2)MPLAB XのCode Configuratorを使用して必要機能とピン割り当てを設定する
 a)Systemを設定する
  図ー1を参照して下さい
  今回は、48MHzで設定してみました
 b)TMR1を追加しタイマ間隔を設定する
  図ー2を参照して下さい
  今回は、1mSecで設定してみました
 c)Pin Managerで、入出力ピンの設定を行う
  図ー3、図ー4を参照して下さい
  今回は、RB5を出力に設定し、名称を[IO_TEST05]にしてみました
3)[Generate Code]ボタンを押してコード生成を行う

4)LEDをチカチカさせる為のコードを記述する
 と、言っても、MPLAB XのMCC(Code Configurator)がプログラムの
 大半を自動生成してくれるので、コーディングは以下の数行となる

 int main(void)
 {
   uint8_t uiTimer;
   uint16_t uiCount;

   // initialize the device
   SYSTEM_Initialize();

   IO_TEST05_SetHigh();

   while (1)
   {
     // Add your application code
     if ( TMR1_SoftwareCounterGet() != uiTimer ) {
       // 1mSec毎に変化する
       uiTimer = TMR1_SoftwareCounterGet();
       uiCount++;
       // 1秒経過したか確認する
       if ( uiCount >= 1000 ) {
         // 出力を反転させる
         IO_TEST05_Toggle();
         uiCount = 0;
       }
     }
   }
   return -1;
 }

5)コンパイルする

6)書き込みを行う

7)LEDがチカチカすれば回路に問題無し

〔図ー1〕

f:id:Nov11:20161108232303j:plain
〔図ー2〕

f:id:Nov11:20161108232555j:plain
〔図ー3〕

f:id:Nov11:20161108232622j:plain
〔図ー4〕

f:id:Nov11:20161108232645j:plain

 

しかし、PIC32MXでMCC(Code Configurator)を使用している人はいないようです
やはり、このスペックなので、FreeRTOSのHarmonyを使用しているみたいですね
筆者も、Harmonyを使った方が良いのかなぁ~って悩んでます

 ちなみに、8ビットMCUと16ビットMCUは、以下を参照してください

nov11.hatenablog.com

nov11.hatenablog.com

 

なお、ブログの内容を参照して実行した結果に責任は負いかねますので、ご了承下さい

 

自作したロボットアームを制御する(現実認識を行う)(その2)OpenCVで将棋の駒を認識する

OpenCVVisual studio C++を使ってオセロのコマが認識できる様になったので、プログラムに認識方法などの改良をして将棋の駒が認識できるかやってみた
駒の重なりや光源などの影響で誤認識を起こしたり、認識スピードが遅いなど色々と解決しなければいけない問題点はあるが、とりあえずのところ何とかなりそうだ
後は、OpenCVの学習機能などを利用して、認識率と処理速度を向上させるとしよう

それにしても、凄い時代になったものだと、つくづく感じでしまう
以前、音声合成を作成した時の費用が、1000円程度で、今回の画像認識用のWebカメラも1000円程度!
今は、ノートパソコンを使用しているけど、RasberryPIなどのボードコンピュータにプログラムを移植すると、電源回りを含めても1万円ぐらいで出来てしまう
ずいぶん前に、ガレージメーカーと言うのが有ったけど、開発環境も含めて、アイデアさえ有れば、わずかな金額で起業する事が出来そうだし、CADが使えれば、機械が作ってくれるので、人手もいらない
これで人工知能が、どんどん進化すると、10年後に、良いアイデアを出す人以外はどうなるのか、普通の開発案件は有るのか、少し不安になってしまう今日この頃です

[認識結果]

f:id:Nov11:20161027071323j:plain
[認識している動画]

youtu.be

さて、将棋の駒が認識出来るようになったので、エドと将棋が打てるようになる
ん! えっ! うぁ~! 将棋のプログラムを考えて無かったです
オセロなら何とかなりそうなので、エドとはオセロで遊ぶ事にしよう
そうだ!そうしよう! 将棋は、しばらく封印する事にしようと、筆者は涙ながらに思うのであった

なお、ブログの内容を参照して実行した結果に責任は負いかねますので、ご了承下さい

自作したロボットアームを制御する(現実認識を行う)(その1)OpenCVでAR(拡張現実)を行う

自作したロボットアームのエドをVR(仮想現実)上で自由に動かせたので、エドの目を作成する事にした
こちらも、OpenGLと同様に、OpenCVVisual studio C++を使って作成する事にした
OpenCVを使用してのプログラムは、参考にするサイトが色々とあり、OpenGLに比べて、楽に組めた
ただ、OpenCVのバージョン毎のコーディングが違っていて、整理するのに苦労してしまった

んで。手始めに少し前に流行ったAR(拡張現実)を使って、オセロのコマを認識する事にしてみた
注意点は、使用したリソースをプログラム終了時に開放しないと、プログラムが正しく終了しない
また、使用するWebカメラによって、初回取り込みまで一定の時間(1秒程度)経過して取り込まないと正しく取り込めない

[処理手順]
1)オセロのコマの画像を白と黒、それぞれで用意する
2)OpenCVを使って、画像を取り込む
  cvCaptureFromCAMでカメラと接続する
  cvQueryFrameで画像をキャプチャーする
3)コマ(白、黒)のマッチングを行う
  matchTemplateを使用して、画像が含まれているか確認する
  戻り値の認識率が一定の値以上なら、含まれているので、
  認識した位置を使用して、表示を行う

[認識結果]

f:id:Nov11:20161025073353j:plain

[認識している動画]

youtu.be

余談だけど、ドラマ24の「勇者ヨシヒコ」を見ていて思ってしまった事が、このまま、エドにカメラを取り付け、文字が読める様になり、自分で学習出来るようになると、「寄生獣のミギー」、いや「ヒダリー?」みたくなってしまう...
ん~、何かの啓示なのか、これを機会に改名しろと神様が言っている...はずは無いか!
やはり真面目に取り組む為にも、エドで行こう!

なお、ブログの内容を参照して実行した結果に責任は負いかねますので、ご了承下さい

自作したロボットアームを制御する(仮想現実での制御)(その4)計算により関節の角度を求める

自作したロボットアームのエド(2016年06月13日)のCadデータをVisualStudioとOpenGLを使用してVR(仮想現実)で自由に動かせる様になったので、目標位置に対して、各関節の角度を演算により求める事が出来るようにして、目標角度までをアニメーション表示出来るようにもしてみました

ついでに、移動目標が〇だと寂しいので、移動目標を飛行機(本当はヘリコプターにしたかったけど、難しかったので断念しました)にして、ロボットアームvs飛行機って感じのCGが、以下になります

[エド vs 飛行機]

f:id:Nov11:20161015095548j:plain


計算手順は、意外と簡単で、以下のように計算してみました

ロボットアームの基準座標を点P,飛行機の座標を点R,ロボットアームの関節座標を点Qとします
図で表すと、図ー1の様になり、簡略化した物が図ー2となってます
(注意)筆者は、図画工作系の人間なので、数学的表現が微妙となってます

[計算手順]
1)ロボットアームの基準座標と飛行機の座標との水平垂直角度を求める
  空間座標が分かっているので、atan(アークタンジェント)により求める
2)ロボットアームの基準座標と飛行機の座標との直線距離を求める
  「ピタゴラスの定理」で求める
3)点Rの座標を求めて、角度を算出する
  2)で求めた長さと1)で求めた垂直角度から、点Rの座標を求める
  肩から肘(P-Q)の長さ(A)と、肘から掴み(Q-R)の長さ(B)はわかっているので、
  点Pを中心に半径Aの円と点Rを中心に半径Bの円の交点を求めて、点Qとする
  後は、点P、Q、Rの角度を求めれば、計算完了となる
  言葉ではわかりずらいので、図ー3を参照してください

[図ー1]

f:id:Nov11:20161015095652j:plain

[図ー2]

f:id:Nov11:20161015095740j:plain

[図ー3]

f:id:Nov11:20161015095759j:plain

 

んで、計算し動作させると、こんな感じです

youtu.be
やっと、VR(仮想現実)とは言え、任意の空間座標にアームを動かせる様になったので、いよいよ画像認識に取り掛かろうと思うけど、複数の空間座標を通るようにしてからにするか迷うところです
迷う理由は、複数の空間座標を通す為に、3次元の補間計算プログラムを作成しないといけない...
結構大変な作業になりそうなので、悩ましぃとことです

なお、ブログの内容を参照して実行した結果に責任は負いかねますので、ご了承下さい