地域密着型エリア広告配信リクルートの地域密着型広告ドコイク?アドネットワーク Ads by ドコイク?[無料でホームページを作成] [通報・削除依頼]
[無料でホームページを作成] [通報・削除依頼]
婚活

2017年01月 のアーカイブ

2017年1月28日 14時35分52秒 (Sat)

ロボットをコマンドで動かす

2017年1月20日に動かしたロボットを、統合開発環境のシリアルモニタからコマンドを入力して関節を動かせるようにしてみます。
なお、今回からロボットは下のようにアクリル板に取り付け、固定しました。
img_20170128-142036.jpg

ロボットの配線は2017年1月20日と同じで、電池6V―それぞれのモータの赤線、電池のマイナス―それぞれのモータの茶色線、電池のマイナス―GND、指モータのオレンジ線―8番ピン、肘モータのオレンジ線―9番ピン、肩モータのオレンジ線―10番ピンとします。

コマンドは、ホームポジションに移動(1)、肩を動かす(2)、肘を動かす(3)、ハンドを動かす(4)の4種類あり、昨日作ったように、それぞれの整数の後に整数以外の文字を入れます。
さらに、2・3・4を選んだ場合には、角度をどうするかをさらに入力します。

スケッチは下のようになります。
昨日の送信部分を新たにserialcomという関数にして、入力された数値を返します。

#include <Servo.h>
Servo s1,s2,s3; // Define our Servo

void setup() {
  Serial.begin( 9600 ); // 9600bpsでポートを開く
  s1.attach(8); // hand on digital pin 8
  s2.attach(9); // elbow on digital pin 9
  s3.attach(10); // shoulder on digital pin 10  
  Serial.println("start"); // スタート
}

int serialcom()
{
  char c;
  int i = 0; // ループ用
  char str[20]; // 文字列格納用

   while(1) {
   if ( Serial.available() > 0 ) {
     c = Serial.read();
     if (c >= '0' && c <= '9') { // 数字の時は文字列追加
       str[i] = c;
       i++;
       if (i == 19) { // バッファが一杯になったときも終了
         str[i] = '\0'; // 文字列を終わらせる
         break;
       }
     } else { // 1文字以上受信していて数字以外の文字を受信した時は文字列受信終了
         str[i] = '\0'; // 文字列を終わらせる
         break;
     }
    }
  }
  int a = atoi(str); // int型に変換
  return a;
}


void loop() {
  int mode, h, e, s;

  Serial.println("Input mode. 1:initialize  2:shoulder  3:elbow  4:hand");
  mode=serialcom();
  if (mode==1 || mode==2 || mode==3 || mode==4){
 
    Serial.println( mode); // 出力

    if(mode==1) {
      s3.write(0);  //shoulder 
      delay(1000);   // Wait 1 second
      s2.write(70);  //elbow straght
      delay(1000);   //  1 second
      s1.write(90);  //hand close
      delay(1000);   // Wait 1 second
    }
    
    if(mode==2) {
      Serial.println("shoulder:0-180");
      s=serialcom();
      if(s>=0 && s<=180){
        Serial.println(s); // 出力
        s3.write(s);  //shoulder 
        delay(1000);   // Wait 1 second
      } else {
        Serial.println("wrong range");     
      }
    }

    if(mode==3) {
      Serial.println("elbow:0-180: 70 center");
      e=serialcom();
      if(e>=0 && e<=180){
        Serial.println(e); // 出力
        s2.write(e);  //elbow 
        delay(1000);   // Wait 1 second
      } else {
        Serial.println("wrong range");     
      }
    }

    if(mode==4) {
      Serial.println("hand:90:close, 0:open");
      h=serialcom();
      if(h>=0 && h<=180){
        Serial.println(h); // 出力
        s1.write(h);  //hand 
        delay(1000);   // Wait 1 second
      } else {
        Serial.println("wrong range");     
      }
    }

  }  
}

実験の様子です。
 

2017年1月27日 7時06分25秒 (Fri)

統合開発環境から数値を入力する

Arduinoの統合開発環境のシリアルモニタから数値を設定する方法を考えます。
Serial.read関数は受信データの最初の1バイトだけ読み込みます。この関数しか使えないので、数値を設定するためには工夫が必要です。
また、文字列の最後の改行文字は文字列としては読み込まないので、これも工夫が必要です。
ここでは、改行文字ではなく、数字でない文字で文字列の終了を表すことにしました。


シリアルモニタに表示されるものは、設定された整数になります。

下にスケッチを示します。

void setup() {
Serial.begin( 9600 ); // 9600bpsでポートを開く
Serial.println("start"); // スタート

}

void loop() {
char c;
int i = 0; // ループ用
char str[20]; // 文字列格納用

  while(1) {
   if ( Serial.available() > 0 ) {
     c = Serial.read();
     if (c >= '0' && c <= '9') { // 数字の時は文字列追加
       str[i] = c;
       i++;
       if (i == 19) { // バッファが一杯になったときも終了
         str[i] = '\0'; // 文字列を終わらせる
         break;
       }
     } else { // 1文字以上受信していて数字以外の文字を受信した時は文字列受信終了
         str[i] = '\0'; // 文字列を終わらせる
         break;
     }
    }
  }
  int a = atoi(str); // int型に変換
  Serial.println( a ); // 出力
}

実験のようすです。
 

 

2017年1月26日 7時20分16秒 (Thu)

JavascriptでPCにデータを表示する

前提として、2017年1月16日の(3)をやっておきます。
配線は2017年1月25日と同じです。

Javascriptを使ってArduinoに繋がれた温度センサLM35DZの計測値をPCに取得します。
作業ディレクトリjsに、次のようなJavascriptのソースプログラムを作り、temp_test.jsとファイル名をつけます。

var five = require("johnny-five");
five.Board().on("ready", function() {
  var temperature = new five.Thermometer({
    controller: "LM35",
    pin: "A0",
  });
  temperature.on("change", function() {
    console.log(this.celsius + "C");
  });
});

コマンドプロンプトを立ち上げ、作業ディレクトリjsに移動し、
node temp_test.js(Enter)
と打ちます。

実験のようすを示します。
 


参考文献
部員三号:ArduinoとJavascriptで始めるIoTプログラミング

2017年1月25日 7時03分16秒 (Wed)

温度センサLM35DZの実験

温度センサLM35DZは、110円で秋月電子から購入できます。
//akizukidenshi.com/catalog/g/gI-00116/
このセンサは出力値の電圧(V)が、そのまま100倍することで摂氏温度に換算できるという、使い勝手のいいものです。
Arduinoは5Vでアナログ値が1024となることから、アナログ値の読みをAとすると換算は
500A/1024と表すことができます。

img_20170125-085315.jpg
配線は、写真のように頭の平らな部分をこちらに向けたときに、左のピン―5V、中央のピン―A0、右のピン―GNDとします。
 
動作確認のスケッチは下記のようになります。

float A_val;        // アナログ入力値
float temp  = 0;  // 摂氏値( ℃ )

void setup()
{
  Serial.begin(9600);   // シリアル通信速度
}

void loop()
{
  A_val = analogRead(A0); // アナログピンから計測値を取得
  temp = ((5.0 * A_val) / 1024.0) * 100.0;  // 摂氏温度に換算

  Serial.print( temp );  // 改行しながら出力
  Serial.println(" C");
  delay(1000);
}

実際の実験のようすは

2017年1月23日 7時37分06秒 (Mon)

ITはここから攻める

昨日パソコン教室の先生に講演をしましたしました。小型コンピュータArduino のことや、QGIS、衛星測位システムについて話をして、今後のITやIoTについて議論しました。また、車椅子のボランティアを考慮してワークを行いました。

パソコン教室や塾はIT(情報技術)の草の根的なところだと思います。ここからIoTやクラウド、人工知能の応用を使った国の変革をやっていったらどうかと思っています。
img_20170123-144121.jpg
img_20170123-144141.jpg


プロフィール

プロフィール画像
ニックネーム
宇宙技術汎用化トレーナー 岩田 敏彰
性別
男性
血液型
A型

ブログ

1234567
891011121314
15161718192021
22232425262728
293031
QRコード
携帯用QRコード
アクセス数
ページビュー数