スキップしてメイン コンテンツに移動

加湿器をロボアームで起動してみよう!<2020年版>

 

今回は、以前投稿した記事のバージョンアップまでは行きませんがある程度改良していきます。
その記事に関しては以下になります。

この記事の続編となりますので先に読んでおく事をお勧めします。

大きく改良する点は以下になります。

改良点

  • HaLake Kitから汎用のESP8266への取り換え
  • 回路の見直し(少し)
  • プログラムの見直し(少し)
  • ラズパイからの別の制御方法



主に使ったもの

  • ロボットアーム(Romi用ロボットアームキット)
  • ESP8266
  • Raspberry pi 3B+

ロボットアームに関しては前回の記事と同じものを使うので説明は省きます。

ESP8266に関しては写真の物を使います。

スイッチサイエンスさんの物を使用していますがHaLakeの備品を使ったのでいつ購入したものなのかわかりません。そのため現在販売しているものとは一部仕様が変わっている可能性があるので注意してください。

念のため同じようなもののリンクを貼っておきます。

ESPr® Developer(ESP-WROOM-02開発ボード)www.switch-science.com

  • 注意:前述したように仕様が違う場合がありますので注意してください。ESP8266チップを使用した物であれば問題なく動作すると思いますが、リンクの物を使用する場合は自己判断でお願いします。



汎用ESP8266への取り換えと回路の変更

前回の記事ではHaLake Kitを使っていましたが入手性やピン配列が若干違うようなので汎用性が高い市販品に取り換えた方が、お試しいただけやすいと思うので取り換えていきます。

ESP8266は前述したスイッチサイエンスのリンクの物とピン配列がほぼ同じなので画像で示した位置と同じように使っていただければ問題ないと思います。

Fritzingパーツはこちらの物を使わせていただきました。

github.com

電源(5V)GND制御線
制御線ピンチアーム手首
ESPピン1654

前回の記事を読んで頂いた方にはわかると思いますが、今回はサーボモータの電源制御用のMOSFETを使用していないため多少回路が簡略化されています。
しかし、サーボモータの電源を入れっぱなしなので消費電力や音などが気になる方は入れる必要がありそうです。
HaLakeでは電源を入れっぱなしで運用していたようなので、今回は省いてあります。



プログラムの見直し

前回の記事で実際にHaLakeで稼働うさせていたプログラムとして紹介されていたものが以下になります。

github.com

今回はこちらのプログラムを少し簡略化していきたいと思います。
大まかな流れは変えていませんので前回の記事にプログラムの説明が書かれているので参照していただけると幸いです。

esp8266側

#include <Arduino.h>
#include <Servo.h>
#include <vector>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

// hand: 0-180 | open-close
// arm: 0-100 | up-down
// wrist: 115-180  | down-up

#define HAND_SERVO_PIN 16
#define ARM_SERVO_PIN 5
#define WRIST_SERVO_PIN 4

Servo HandServo; 
Servo WristServo; 
Servo ArmServo; 

ESP8266WebServer server(80); 

uint8_t changeHandServo(uint8_t percentage){ // 0-100 : close-open
  Serial.println(180 - (percentage * 1.8));
  if(percentage <= 100) return 180 - (percentage * 1.8);
}

uint8_t changeWristServo(uint8_t percentage){ // 0-100 : down-up
  Serial.println(map(percentage, 0, 100, 115, 180));
  if(percentage <= 100) return map(percentage, 0, 100, 115, 180);
}

uint8_t changeArmServo(uint8_t percentage){ // 0-100 : down-up
  Serial.println(100 - percentage);
  if(percentage <= 100) return 100 - percentage;
}

int16_t str2uint8(String target){
  long result = target.toInt();

  if(result > 255) return -1;
  if(target == "" || result > 0) return result;
  else -1;
}

void setup(){
  HandServo.attach(HAND_SERVO_PIN);
  WristServo.attach(WRIST_SERVO_PIN);
  ArmServo.attach(ARM_SERVO_PIN);

  HandServo.write(changeHandServo(30));
  WristServo.write(changeWristServo(0));
  ArmServo.write(changeArmServo(80));

  Serial.begin(74800);
  delay(500);

  WiFi.config(IPAddress(192,168,3,220),IPAddress(192,168,3,1),IPAddress(255,255,255,0));
  WiFi.begin("nyampass-2g", "kijibuchitama");
  while(WiFi.status() != WL_CONNECTED){
    delay(1000);
    Serial.print(".");
  } 

  if(WiFi.status() != WL_CONNECTED){
    Serial.println("No Connection");
    ESP.restart();
  }
  else Serial.println(WiFi.localIP());

  server.on("/hand", [](){
    if(server.args() == 1){
      if(server.argName(0) == "percentage"){
        int16_t angle = str2uint8(server.arg(0));

        if(angle >= 0){
          HandServo.write(changeHandServo(angle));
          server.send(200, "text/html", "Hand was changed.");
        }
      }
    }

    server.send(200, "text/html", "Failed.");
  }); 

  server.on("/wrist", [](){
    if(server.args() == 1){
      if(server.argName(0) == "percentage"){
        int16_t angle = str2uint8(server.arg(0));

        if(angle >= 0){
          WristServo.write(changeWristServo(angle));
          server.send(200, "text/html", "Wrist was changed.");
        }
      }
    }
    server.send(200, "text/html", "Failed.");
  });

  server.on("/arm", [](){
    ArmServo.write(changeArmServo(0));
    delay(500);
    ArmServo.write(changeArmServo(100));
    server.send(200, "text/html", "Arm was changed.");
  });

  server.begin();
}

void loop(){
  server.handleClient();
 }

変更点を挙げるとボタンを押すために重要なアームの動きを制御するときパーセントで指定せず/armにアクセスすると自動でボタンを押す動作をしてくれます。以前のプログラムではアームを下に降ろして上げる動作をパーセントで指定してあげないといけなかったので簡略化しました。そのほかはあまり使うことがなかったのでそのままのプログラムにしておきました。必要に応じて消してもよさそうです。
もう一つの変更点は、シリアル通信での操作が出来るようになっていましたがそれをすべて削除しました。以前の記事では説明されていなかったと思いますがデバッグや何かあったときに導入されていたんだと思います。

次にラズパイ側からの制御プログラムを紹介していきたいと思います。と言ってもとても簡単なつくりなので紹介する必要があるかはいまいちなところですが...
今回はnodejsではなくPythonからの制御にしてみました。
ラズパイ側

import requests

URL = 'http://192.168.3.220/arm'

res = requests.get(URL)
print(res)

とても簡易的なものになっているのでエラーなどが出てもわからない作りです。重大なエラーが出たら加湿器がつかないのでこれでも十分だと思っています。
あとはラズパイの方の設定をしていきましょう。ラズパイのコマンドプロンプト

crontab -e

でcrontabの設定を編集できます。その中に私の場合は水曜日以外の朝8:30にこのプログラムを起動させたいので以下のように追加していきます。

30 8 * * 0,1,2,4,5,6 sudo python3 ~/humidifier/cron.py

分、時、日、月、曜日の順で書かれていて曜日はカンマで区切ることによって複数指定できます。(0が日曜日で番号が順にふられています。)そのあとにラズパイで実行したいコマンドを記述することで指定した時にコマンドを実行してくれます。
これで最後のプログラムは味気ないですが完成しました。
実を言うとスマホPCからローカルのサイトにアクセスしていつでも簡単に起動や自動起動時間の設定を出来るものを作っていたのですが問題があり思い通りに動かなかったので前述した案に切り替えました。いつか完成出来たら載せたいです。

まとめ

  • 汎用性の高い基盤に差し替えられた
  • プログラムの簡略化(少し)
  • 設置をし直して見た目の改善が出来た

コメント

このブログの人気の投稿

Phaser3 + Typescriptを使ってRPGゲームの基礎を作ろう!その2

前回の記事 に引き続きPhaser3+Typescriptを使って RPG の基礎を作っていきます。 この記事は前回の記事を呼んだ前提で説明していきますので、ぜひそちらを先に読むことをお勧めします。 また、今回の記事は前回よりも難易度と内容量が上がっていますが、記事の最後に作業後の リポジトリ のリンクがありますので、そちらを先にダウンロードしてそちらと比較しながら学習することができます。 前回まで作成した状態のプログラムが以下の リポジトリ からダウンロードできますので前回まででうまくいっていない方は参考にしてみてください。 github.com 最終目標(再掲) ・Phaser3とTypescriptで RPG ゲームの基礎を作る。 ・Phaser3をTypescriptで使う方法を学ぶ ・Phaser3の使い方を学ぶ 今回の目標 ・ゲームの作り方の断片を知る ・キャラの表示できるようにする ・キャラを移動できるようにする ・当たり判定をつける ・ NPC の追加してみる ・話しかけられるようにする 開発前提(再掲) ・Nodejsの環境・知識がある ・ Javascript ・Typescriptがある程度かける ・当ページ紹介の環境を試す場合はgit・ github の知識がある 使用した主要Nodeモジュール(再掲) ・typescript(Typescriptの コンパイル 用) ・phaser(フロントの Javascript 用ゲームライブラリ) ・live-server(ソースを監視してブラウザのページをリロード) ・ts-loader(webpackがTypescriptをバンドルする用)webpack(言わずと知れたモジュール依存をいい感じに解決しバンドルする) ・webpack- cli (webpackを コマンドライン で使用するのに必要) 注:各Nodeモジュールバージョンは後述 当ブログ仕様の画像素材の注意点 当ブログで使用する画像素材は『 ピポヤ倉庫 』より許可なしで無償再配布・改変が認められたものを改変して作成されたものです。 中には許可なく再配布・改変してはいけない素材もインターネット上には多く存在するのでそれらを使用するときは十分に規約を呼んでから使用しましょう。 1. キャラの表示 想定画面 今回は、はじめにキャラつまり操作

M5Stackで、においセンサー(TGS2450)を使ってみる。(LCDに表示編)

今回は、においセンサー(TGS2450)から取得したデータをM5Stackの LCD にグラフ表示をしていきます。 今回主に使用したもの M5Stack 10Ω抵抗 5本 Pch  MOSFET  2SJ334(スイッチとして利用) M5StackSideBB(ブレッドボード) M5Stackのピンはそのままだと配線するとき手間がかかるかと思いますので、今回はM5StackSideBBを利用しました。 ブレッドボードも付いているので、手軽に電子工作できるので個人的にオススメです。 SideBB for M5Stack www.switch-science.com 諸注意 本ブログのプログラムはArduinoIDEまたはPlatformIOでM5Stackの開発ができる状態であること前提のものですので、各自導入をお願いします。 過去に Windows のArduinoIDEで M5Stackの開発環境を構築する記事 があるので、参考にしてください。 においセンサー(TGS2450)について 今回使用したセンサーは 秋月電子通商 で購入できます。 http://akizukidenshi.com/catalog/g/gP-00989/ akizukidenshi.com TGS2450には4つのピンがあり、使用するのはそのうちの3本でヒーターを温めるピン、センサー情報を得るピン、GNDがあります。 ここで注意したいのは、ヒーター電圧は1.6Vと記述されているのでM5Stackで利用するときは分圧して3.3Vを1.6V近くまでに降圧することをお勧めします。 TGS2450のセンサーは可変抵抗になっており、データシートには5.62kΩ〜56.2kΩの間を抵抗が変化し、においが強いとより低くなると記述されていました。 よって、センサーの値をM5Stackで取得するにはセンサー抵抗と外部に接続する任意の値の抵抗による分圧回路によって求めることができます。 TGS2450の動作方法は、250ms周期でセンサーに電圧を5ミリ秒on、245ミリ秒offの状態にしてヒーターは8ミリ秒on、242ミリ秒offにすることで値を取得します。 配線 においセンサーとM5Stackの配線 上の図が配線図です。 30Ωの抵抗は10Ωの抵抗を三つ直列に接続して作成しました。 また、上部の抵抗10Ω二

Phaser3 + Typescriptを使ってRPGゲームの基礎を作ろう!その1

今回はPhaser3とTypescriptを使って簡単な RPG ゲームを作る方法を紹介していきます。 内容はPhaser3およびゲーム作りについての記事なので、Nodejsの周辺モジュールなどの説明は一部省いての説明になりますのでご了承ください。 またこの記事では Phaser2 ではなく Phaser3 を使用するので注意してください。 この記事は二部構成になりますので、この記事を読んだ際はぜひ次の記事も読むことをお勧めします。 最終目標 ・Phaser3とTypescriptで RPG ゲームの基礎を作る。 ・Phaser3をTypescriptで使う方法を学ぶ ・Phaser3の使い方を学ぶ 今回の目標 ・開発環境を整える ・Phaser3の開発構成を知る ・スタート画面を作る ・マップ表示をさせる 開発前提 ・Nodejsの環境・知識がある ・ Javascript ・Typescriptがある程度かける ・当ページ紹介の環境を試す場合はgit・ github の知識がある 使用した主要Nodeモジュール ・typescript(Typescriptの コンパイル 用) ・phaser(フロントの Javascript 用ゲームライブラリ) ・live-server(ソースを監視してブラウザのページをリロード) ・ts-loader(webpackがTypescriptをバンドルする用)webpack(言わずと知れたモジュール依存をいい感じに解決しバンドルする) ・webpack- cli (webpackを コマンドライン で使用するのに必要) 注:各Nodeモジュールバージョンは後述 1. 最低限の開発環境の準備 今回最低限の環境を整えるために、『Typescript + Phaser3』の開発テンプレートを github リポジトリ で公開しました。 以下からZIPをダウンロードするか、 git clone コマンドで各自環境に展開してみてください。 ここから先は リポジトリ のプログラムを元に説明していきます。 github.com 展開するとファイル構造は以下のようになっているかと思われます。 注: 他にもファイルやフォルダがあるかと思われますが、表記されているのは今回使うものになっています。 - src/ (これから書くプログラムの保存領域)