Robot(3)2016年03月18日

制御ソフト

コントローラーにはWiFiモジュールESP-01を使用していますが、ソフトウエアの開発はArduino開発環境で行えます。このロボットアームコントローラーにはWiFiアクセスポイント、WEBサーバー、WEBサービス(ここがサーボ制御指示を受け取ります)の3機能とサーボ制御のファームウエアを内蔵させました。これでWiFi接続できるスマホやタブレットからでもWEBブラウザさえあればロボットアームが操作することができます。
サーボ制御のファームウエア
WiFiモジュールESP-01のハードウエアではGPIOが2個しか出力されていませんので2個のサーボしか制御できません。そこでI2Cという通信方式を使用してPCA9685サーボドライバーICで制御できるサーボ数を拡張します。このドライバーICを使用することでサーボをドライバーIC1個につき16台まで動作させることができます。サーボ制御ドライバーはAdafruteが公開しているライブラリーが使用できます。あとは急激な動作をしないようにプログラムで制御することでサーボの基本動作とします。実際には現在の位置から指定位置まで1度刻みで一定時間間隔のインターバルをもたせた連続動作にすることで実現しています。

// 引数はサーボ番号、移動先、移動元
void servo_write(int n, int ang, int npos){
  int degrees;
  uint16_t pulselen;

  if (npos < ang) {
    for (degrees = npos + 1; degrees <= ang; 
                 degrees++) {
      pulselen = map(degrees, 0, 180, SERVOMIN, 
             SERVOMAX);
      pwm.setPWM(n, 0, pulselen);
      delay(10);
    }
  } else if (npos > ang) {
    for (degrees = npos - 1; degrees >= ang; 
                  degrees--) {
      pulselen = map(degrees, 0, 180, SERVOMIN, 
             SERVOMAX);
      pwm.setPWM(n, 0, pulselen);
      delay(10);
    }
  }
}
ユーザーインターフェース
WiFi動作はアクセスポイントモードにしているのでインターネットに接続しているWiFi環境は必要ありません。スマホやタブレット、PCから作成したSSIDにWiFi接続すると専用のネットワークに接続され、192.168.4.1にアクセスするとプログラムに内蔵したWEBサーバーがロボットアーム制御のためのHTML画面を表示します。WiFiモジュールESP-01はArduinoと比較すると格段と高機能です。32ビットMPU、WiFi機能以外に搭載メモリーがたくさんあるので画面のHTMLはすべてプログラムに直接書き込んでいます。LCD表示機能を追加してもまだメモリーに余裕があるので画面をもう少しリッチに仕上げることができそうです。このHTML画面はjavascriptのXMLHttpRequestを使用したシングルページアプリケーション構成になっています。ページ移動をせず画面上のスライダー値をWiFiモジュールESP-01に各サーボの制御情報として送信し指定のサーボを動作させます。また、動作ログを記録しており、ログから自動実行スクリプトを作成し、一連のサーボ制御情報を自動実行する機能(シーケンサー)も組み込んでいます。このシーケンサーは作成されたスクリプトを1行づつ非同期処理で順次WiFiモジュールESP-01に送信することで実現します。

Robot(2)2016年03月07日

サーボ制御

ロボットアームの制御はWiFiモジュールESP-01(プログラムはArduino)で行います。Arduino単体でも12個のサーボを制御できますが制御画面などを作成するにはさすがに限界があります。Arduinoなら使用するライブラリーはServoライブラリーで簡単に制御できます。このライブラリーは使用方法は簡単なのですが、動作時間を制御できません。例えばアームを90度回す動作を1回で行うとすごい勢いで回りアームが転倒してしまいます。そこで動作時間が指定できるライブラリーを探しました。世の中には同じ悩みを持っている方がいるのですね。VarSpeedServoというライブラリーです。このライブラリーでは指定角度を動かす時間も指定できます。アームの上下動作、アームの回転動作、グリッパーの開閉動作の動作時間を変えることができます。このライブラリーが利用できるのはArduinoで制御する場合です。現在のところWiFiモジュールESP-01を使用してI2C経由でサーボを操作する場合には使用できません。WiFiモジュールESP-01を使用する場合はAdafruteが公開しているライブラリーになります。指定角度を動かすことはできますが時間指定ができません。
ロボットアームコントローラーの回路図です。

Robot(1)2016年02月17日

ロボットアーム

3Dプリンターでオートベッドレベリングに使用する予定だったマイクロサーボがMarlin Farmwereの設定ができず、結局使用されていませんでした。何かに利用できないかと探していたら3Dプリントしたパーツとマイクロサーボでロボットアームを作成するというのを見つけました。
3Dプリントしたパーツの他にマイクロサーボ5個、コントロールボードで作成できます。コントロールボードにはもちろんArduinoを使用します。ちょっと工夫が必要ですがWiFiモジュールを使用してWEBアプリにすればスマホからアームを操作するなんてできそうです。PCA9685を使用したこのボードを使用すれば16個までのマイクロサーボがI2C経由で制御できます。
リンクはe-Bayですが国内ではaitendoやスイッチサイエンスで同じモジュールの取り扱いがあります。このボードを使用してGPIOの数が限られているWiFiモジュールでもたくさんのマイクロサーボを制御できます。
ここまでお膳立てが揃っていればと早速製作しました。いまは基本機能のテストプログラムをArduino互換ボードで走らせていろいろとテストしています。

WiFiモジュール(2)2016年02月13日

ESP8266改造

正月にいじっていたESP8266というWiFiモジュールの改造に成功です。改造と言ってもGPIOを2本引き出しただけです。オリジナルのESP-01は利用できるGPIOが2本しか出ていません。その他にはPCと通信するためのシリアル送受信ピンです。OneWire温度センサーにGPIOを使用しているので他に何もつけることができませんでした。今回はESP8266 ICの9、10ピンから直接配線をそれぞれ引き出し、GPIO14とGPIO12が使用できるようになりました。とは言え0.1mmピッチのICの足に直接リード線をはんだづけするわけです。引き出したGPIOはI2Cインターフェースとして使用します。
LCD-Blue-I2Cで紹介されているライブラリーを使用してI2C接続のLCD(PCF8574Tを使用)にIPアドレスとクラウドにアップした最新の温度を表示するようにしました。PCF8574Tと秋月の小型キャラクターLCDの組み合わせで動作させるためのコードは、

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#define BACKLIGHT_PIN     3
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6,
       7, BACKLIGHT_PIN, POSITIVE);  
setup()の最初にI2C使用のピン番号を指定します。
Wire.begin(14, 12);
lcd.begin(16,2);      // initialize the lcd 
   ....
lcd.home ();          // go home
lcd.print("Hello,  ESP-01 ");  
をそれぞれ追加・修正しました。後は普通にLCDにデータを書き込みます。

WiFiモジュール2016年01月03日

ESP8266

年末にe-Bayに注文してあったWiFiモジュールが届きました。3Dプリンターの部材がまだ届かないので2016年のスタートは電子工作から始まりました。AI Tinker (中国)製のESP8266というモジュールを使用したWiFiモジュールです。ただのWiFi接続モジュールではありません。
CPU、メモリー、GPIOインターフェースを備えるマイクロコントローラーです。ということはこのモジュールのみでWiFi経由で外部機器が操作可能だということです。最近流行りのIoT用のモジュールデバイスです。最大の特徴はこのスペックで$4.00程度と大変安いことです。スペックは、

  • 32-bit RISC CPU: Tensilica Xtensa LX106 running at 80 MHz
  • 64 KiB of instruction RAM, 96 KiB of data RAM
  • External QSPI flash - 512 KiB to 4 MiB
  • IEEE 802.11 b/g/n Wi-Fi
  • Integrated TR switch, balun, LNA, power amplifier and matching network
  • WEP or WPA/WPA2 authentication, or open networks
  • 16 GPIO pins
  • SPI, I²C,
  • I²S interfaces with DMA (sharing pins with GPIO)
  • UART on dedicated pins, plus a transmit-only UART can be enabled on GPIO2
  • 1 10-bit ADC
AI Tinkerからは15種類のモジュールが出ています。モジュールによってはすべてのインターフェース機能が利用できるわけではありませんがESP-01(8ピン)モジュールでも2個のGPIOは利用可能です。
さてプログラミングですが、これがまたすごいところでArduino IDE環境でプログラミン・書き込みが可能です。最初だけちょっと面倒がありますが、これさえ済ませると後はArduinoと同様にプログラミングすることができます。ここのサイトを参考にしてください。
DS18B20温度センサーのサンプルを参考にThingSpeakにデータを送信するプログラムを作成しました。写真の回路を組んでプログラムを作って半日といったところです。すごく簡単にできてしまいます。できたものは乾電池2本でも動かすことができます。データは1分間隔で更新しています。温度ですからもっとゆっくりでもよいかもしれません。いろいろと工夫次第でIoTデバイスが簡単にできるWiFiモジュールです。