Arduino(アルドゥイーノ)始めます
Amebaでブログを始めよう!
1 | 2 | 3 | 4 | 5 | 最初次のページへ >>

M5stickCで遊ぶ

遅ればせながらM5Stick-Cを購入しました。

 

M5Stick-CとはM5Stackの亜種?で

・ESP32ベースでwifiにつながる

・0.96インチ液晶、6軸センサ、赤色LED、3つのボタン(うち一つは電源用)などを内蔵

Groveコネクタ付きで面倒な配線なしに様々な周辺機器を接続可能

・80mAhのバッテリ内蔵

・Arduino IDEでプログラミング可能(ほかにもMicroPythonUIFlowもOK)

・サイズは48mm×24mm×14mm

・価格が税抜1,800円(M5stack Grayが約4,000円だったので半額!)

という夢のような?デバイスです。

発売直後は秋葉原で売り切れていて買えませんでした。

 

液晶はグラフィックLCD!

 

M5Stick-CにはGroveコネクタがついているので、ENV UNITを接続して見ました。

このユニットはDHT12温湿度センサとBMP280気圧センサがついているものです。

約500円。安い。Groveケーブルがついているのでそのまま接続できる。便利。

M5Stick-Cの液晶に温度湿度気圧が表示されています。

電池内蔵なのでUSBケーブルやACアダプタなしでもうごいているんです!

ENV HATだと見た目もっとスマートにできると思います。こちらを買えばよかった!

 

スケッチは下のような感じです。

M5Stick-C クイックスタートを参考にArduino IDEにM5StickCをセットアップ、

さらにDHT12ライブラリをインストールした状態で動きます。

 

 

#include <M5StickC.h>
#include "DHT12.h"
#include <Wire.h> //The DHT12 uses I2C comunication.
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>

DHT12 dht12; //Preset scale CELSIUS and ID 0x5c.
Adafruit_BMP280 bme;

void setup() {
    M5.begin();
    //groveコネクタのI2C使う
    Wire.begin(32,33);
    // DHTセンサー
    dht12.begin();
    //LCD向き変更
    M5.Lcd.setRotation(1);
    //シリアル通信
    Serial.println(F("ENV Unit(DHT12 and BMP280) test..."));

    while (!bme.begin(0x76)){  
      Serial.println("Could not find a valid BMP280 sensor, check wiring!");
      M5.Lcd.println("Could not find a valid BMP280 sensor, check wiring!");
    }
    M5.Lcd.println("ENV Unit test...");
}

void loop() {
 
    float tmp = dht12.readTemperature();
    float hum = dht12.readHumidity();
    float pressure = bme.readPressure();
    Serial.printf("Temperatura: %2.2f*C  Humedad: %0.2f%%  Pressure: %0.2fPa\r\n", tmp, hum, pressure);

    M5.Lcd.setCursor(0, 0);
    M5.Lcd.setTextColor(WHITE, BLACK);
    M5.Lcd.setTextSize(2);
    M5.Lcd.printf("Temp: %2.1f  \r\nHumi: %2.0f%%  \r\nPressure:%2.0fPa\r\n", tmp, hum, pressure);

    delay(100);
}

 

 

 

 

 

 

Wio LTEとIFTTTをつかってGooglespreadsheetsに温湿度をおくる

Wio LTEとは

Wio LTEというSIMスロット付きのLTE通信可能なマイコンボードが発売されています。

今までマイコンでLTE通信をしようとすると安くても3万円前後していたのですが、こちらはなんと1万円ちょいで購入できちゃいます。

さらに!Arduino IDEでスケッチを記述して書き込むことが可能です!

 

Arduino IDEへのインストール


環境構築と書き込みはちょっと癖がありますが、下のリンク通りに行えば問題ないかと思います。

https://github.com/SeeedJP/WioLTEforArduino/wiki/Home-ja

とても分かりやすく書いてあるので届くまでに眺めておきましょう。

ポイントとして

・環境構築はボードの追加、ライブラリの追加、デバイスドライバー(書き込み用と通信用)をインストールすればOKです。

・書き込みについては書き込み実行時はBOOTボタンとRSTボタンを同時押しして書き込みモードにする必要があることと、書き込んだ後はRSTボタンを押す必要がある

ことくらいでしょうか。

シリアルモニタはArduino IDEのものだとポートを見失うことが多いので、別にTeratermをインストールしておいてそれを使うのがおすすめです。

 

SIMについて

LTEはバンドというものがあるらしく、通常docomo向け端末はauやソフトバンクのSIMでは使用できないとかそういった問題があります。

Wio LTE JP versionはFDD-LTE B1/B3/B8/B18/B19/B26に対応しているみたいです。

下のサイトを見る限りドコモ au ソフトバンク いずれも使えそうですね。

http://kakuyasu-sim.jp/band

私はdocomo系の格安SIMであるBiglobe SIMで動作できました。

500MBまで無料な0simを持ってる人は結構面白いかも?

 

スケッチ

スケッチ例にはIFTTT(LTE通信でIFTTTに送信)とDHT11(温湿度センサDHT11で温度湿度を取得)があるのでこれを合体、IFTTTの設定を下のサイトを参考にgoogle spreadsheetに追加するようにしてみました。

https://tomosoft.jp/design/?p=7598

Wio LTE ⇒IFTTT⇒google spreadsheetと転送されていくイメージでしょうか。

---ここからスケッチ

#include <WioLTEforArduino.h>
#include <stdio.h>

#define APN               "biglobe.jp" //ここはSIMに応じて変更
#define USERNAME          "user" //ここもSIMに応じて変更
#define PASSWORD          "0000" //ここもSIMに応じて変更

#define WEBHOOK_EVENTNAME "ここはIFTTTの設定に応じて入力" 
#define WEBHOOK_KEY       "ここもIFTTTの設定に応じて入力"
#define WEBHOOK_URL       "https://maker.ifttt.com/trigger/"WEBHOOK_EVENTNAME"/with/key/"WEBHOOK_KEY

#define INTERVAL          (60000)

//センサーピン
#define SENSOR_PIN    (WIOLTE_D38)

WioLTE Wio;
  
void setup() {
  delay(200);
  //センサ初期化
  TemperatureAndHumidityBegin(SENSOR_PIN);
  
  SerialUSB.println("");
  SerialUSB.println("--- START ---------------------------------------------------");
  
  SerialUSB.println("### I/O Initialize.");
  Wio.Init();
  
  SerialUSB.println("### Power supply ON.");
  Wio.PowerSupplyLTE(true);
  delay(500);

  SerialUSB.println("### Turn on or reset.");
  if (!Wio.TurnOnOrReset()) {
    SerialUSB.println("###TURN ON ERROR! ###");
    return;
  }

  SerialUSB.println("### Connecting to \""APN"\".");
  if (!Wio.Activate(APN, USERNAME, PASSWORD)) {
    SerialUSB.println("###LTE CONNECT ERROR! ###");
    return;
  }

  SerialUSB.println("### Setup completed.");
}

void loop() {
  char data[100];
  int status;
  //温湿度
  float temp;
  float humi;

    if (!TemperatureAndHumidityRead(&temp, &humi)) {
    SerialUSB.println("DHT11 ERROR!");
    goto err;
  }
  //
  SerialUSB.print(humi);
  SerialUSB.print("%  ");
  SerialUSB.print("temperature = ");
  SerialUSB.print(temp);
  SerialUSB.println("C");
  //
  SerialUSB.println("### Post.");
  sprintf(data, "{\"value1\":\"%.2f\",\"value2\":\"%.2f\"}", humi, temp);
  SerialUSB.print("Post:");
  SerialUSB.print(data);
  SerialUSB.println("");
  if (!Wio.HttpPost(WEBHOOK_URL, data, &status)) {
    SerialUSB.println("###POST ERROR! ###");
    goto err;
  }
  SerialUSB.print("Status:");
  SerialUSB.println(status);
  
err:
  SerialUSB.println("### Wait.");
  delay(INTERVAL);
}


////////////////////////////////////////////////////////////////////////////////////////
//

int TemperatureAndHumidityPin;

void TemperatureAndHumidityBegin(int pin)
{
  TemperatureAndHumidityPin = pin;
  DHT11Init(TemperatureAndHumidityPin);
}

bool TemperatureAndHumidityRead(float* temperature, float* humidity)
{
  byte data[5];
  
  DHT11Start(TemperatureAndHumidityPin);
  for (int i = 0; i < 5; i++) data[i] = DHT11ReadByte(TemperatureAndHumidityPin);
  DHT11Finish(TemperatureAndHumidityPin);
  
  if(!DHT11Check(data, sizeof (data))) return false;
  if (data[1] >= 10) return false;
  if (data[3] >= 10) return false;

  *humidity = (float)data[0] + (float)data[1] / 10.0f;
  *temperature = (float)data[2] + (float)data[3] / 10.0f;

  return true;
}

////////////////////////////////////////////////////////////////////////////////////////
//

void DHT11Init(int pin)
{
  digitalWrite(pin, HIGH);
  pinMode(pin, OUTPUT);
}

void DHT11Start(int pin)
{
  // Host the start of signal
  digitalWrite(pin, LOW);
  delay(18);
  
  // Pulled up to wait for
  pinMode(pin, INPUT);
  while (!digitalRead(pin)) ;
  
  // Response signal
  while (digitalRead(pin)) ;
  
  // Pulled ready to output
  while (!digitalRead(pin)) ;
}

byte DHT11ReadByte(int pin)
{
  byte data = 0;
  
  for (int i = 0; i < 8; i++) {
    while (digitalRead(pin)) ;

    while (!digitalRead(pin)) ;
    unsigned long start = micros();

    while (digitalRead(pin)) ;
    unsigned long finish = micros();

    if ((unsigned long)(finish - start) > 50) data |= 1 << (7 - i);
  }
  
  return data;
}

void DHT11Finish(int pin)
{
  // Releases the bus
  while (!digitalRead(pin)) ;
  digitalWrite(pin, HIGH);
  pinMode(pin, OUTPUT);
}

bool DHT11Check(const byte* data, int dataSize)
{
  if (dataSize != 5) return false;

  byte sum = 0;
  for (int i = 0; i < dataSize - 1; i++) {
    sum += data[i];
  }

  return data[dataSize - 1] == sum;
}

////////////////////////////////////////////////////////////////////////////////////////

---ここまで

 

APNの設定(SIMカードを使うときの設定みたいなものです。)は使うSIMカードの会社のウェブサイトから確認してください。

 

biglobeSIMならこことか。

sprintfのところの形式は下のサイトをみてください。JSONとか正直よくわかってないです

https://qiita.com/ko2a/items/f0da03e739b6154d6733#%E3%83%87%E3%83%BC%E3%82%BF%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%83%E3%83%88

 

IFTTTの設定は先ほどのサイトの通りですが

現在MakersはWebhookに、レシピはAppletsと名前?が変わっているようです。

Google DriveのところもGoogle SpreadsheetからAdd row to spreadsheetを選んでください。

 

 

これでたぶんgoogleドライブのマイドライブ>IFTTT>MakerWebhooks>にあるファイルに温度湿度が記録されていくと思います。

温度湿度の列を全体選択してグラフを作成しておくと、データが追加されていったときに自動でグラフも更新されていきますよ。

Eagle がAutodesk Eagleになってました

Kです。

定番の回路図作成ソフトであるEagleがAutodeskに買収されてAutodesk Eagle になっていました。

現在のバージョンは8.0です。

 

幸いFree版はまだ残されていました。ここからダウンロードできます。

Free版の制限は

  • Includes 2 schematic sheets, 2 signal layers, and 80 cm2 board area.
とのこと。
StandardとPremiumはそれぞれ月額2,160円、10,800円。買い切り版は無くなって月々支払う形になった?みたいです。

Macでダウンロードしてみました。何が変わったのかな・・・?
 
DC±12V出力の面白いACアダプターをもらったので、ヘッドホンアンプ基板を作ってます。
回路部分はわからないのでほぼ丸々コピーしてライブラリ作成とレイアウトを楽しむとします。
今の所7.0と8.0の違いよりもOSの違いが大きすぎて戸惑っています。
 
 
 

 

 

ThingSpeakを使ってみる

Kです。今まではXivelyやEasy Iot Cloudを使っていました。

ThingSpeakというサービスも評判が良いようなので試してみました。

 

元ネタはここ

http://www.arduinesp.com/thingspeak

 

Thingspeakにサインアップしたら、Channelを作成します

下のように温度用(1)湿度用(2)のFieldを2つ作成します

Thingspeakの設定はこれでOKでした。

スケッチは

http://www.arduinesp.com/thingspeak

からコピペして

// replace with your channel’s thingspeak API key,
String apiKey = "XXX";
const char* ssid = "XXX";
const char* password = "XXX";

の部分を自分の環境に合わせて変更します。

apiKeyはWrite API Keyで大丈夫でした。

 

あと、私の場合はDHT22を5pinにつなげて使っていたので

#define DHTPIN 5 // what pin we’re connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

DHT dht(DHTPIN, DHTTYPE);

としておきました。

これでスケッチを書き込むと

温度と湿度がブラウザで見れるようになりました。

XivelyやEasyIoTに比べてちょっと使いやすい気がします


 

 

 

ラズペリーパイ用カメラモジュールを買ってみました

Kです。

ラズペリーパイ用カメラモジュールを購入してみました。

4,300円でソニー製CMOSセンサーのV2赤外線LEDと併用すれば暗視もできるものもあるみたいですが安いのでこちらに。

 

1フラットケーブルを接続してラズパイを起動

2ターミナルに "sudo raspi-config"と入力してEnable Cameraからカメラを有効化、再起動

3 IDLEを起動して

import picamera

camera = camera.PiCamera()

camera.capture("./test.jpg")

と入力するとpiフォルダにtest.jpgという名前で画像が保存されます。

 

 

(フラットケーブルでブラブラしてたのでようわからんものが撮影された)

ラズベリーパイでCSVに時刻と温度湿度を記録する

Kです。

Pythonをゲームで学べるコードガールこれくしょんをプレイしていたら、

datetimeモジュールを使用して現在の西暦を取得する問題がでてきました。

さっそくこの記事のスケッチに現在時刻を追加しました。

 

-スケッチ-

import csv
from time import sleep
from datetime import datetime
import Adafruit_DHT

sensor = Adafruit_DHT.DHT11
pin = 4
cnt = 0
f = open("data.csv","w")

try:
    while True:   
        humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
        time = datetime.now()
        t = str(temperature)
        h = str(humidity)
        th = [time,t, h]
        print(th)
        writer = csv.writer(f, lineterminator="\n")
        writer.writerow(th)
        sleep(10)

except KeyboardInterrupt:
    print("end")
    f.close()
    pass
 

-スケッチここまで-

 

赤色部分を追加しました。

これで動かしてみるとIDLE画面には下のように表示されました。

[datetime.datetime(年,月,日,時,分,秒,ミリ秒),温度,湿度]

datetime.datetimeって・・・?

 

csvファイルには

ちゃんと

年-月-日 時:分:秒.ミリ秒,温度,湿度で記録されていました。

2016-10-09 23:37:57.655273,25.0,43.0
2016-10-09 23:38:08.263556,25.0,44.0
2016-10-09 23:38:18.868142,25.0,44.0
2016-10-09 23:38:29.466246,25.0,43.0
2016-10-09 23:38:40.062200,25.0,43.0

 

ミリ秒はいらない気がしますが少し便利になった・・・?

 

 

Easy IoT Cloud 使用方法メモ

最近寒くなってきたので、

この記事で紹介したEasyIoT Cloudを久しぶりに使おうとしたらつまずいたのでメモです。

OSをクリーンインストールしてArduinoライブラリがすべて消えてしまったから?

 

・なぜかBuildのページにある最新のサンプルだとうまくいかない。

こちらのサンプルだとうまく動く。

 

こちらのサンプルだと

1.モジュールを作る

2.モジュールにパラメーターを追加する(温度、湿度で二つ)

3.パラメーターのInstanceId/ParameterId/をスケッチに記入

 

という手間がふえました。

スケッチは こちらのページにあるものを使用する。

 

スケッチの前にページにあるようにEasyIoT Cloudの設定からモジュールを作成、

パラメータを作成する。

NameはそれぞれSensor.Parameter1、Sensor.Parameter2として置いて、

DescriptionにHUMIDITYなどわかりやすく名前を付けておく。

(こうしないとトップページに置いたときに数値が表示されない)

 

 

サンプルスケッチの17,18行目

#define AP_SSID     "xxxxx"
#define AP_PASSWORD "xxxxx"

に無線LANのSSIDをパスワードをそれぞれ入力しておく。

 

 

サンプルスケッチの21,22行目

#define EIOT_CLOUD_TEMP_INSTANCE_PARAM_ID    "xxxxx"
#define EIOT_CLOUD_HUM_INSTANCE_PARAM_ID     "xxxxx"

に上の画像の黒塗り部分のインスタンスIDを丸々コピーする。温度・湿度でそれぞれ別物。

 

サンプルスケッチ49行目

 dht.setup(2); // data pin 2

はDHT22を接続するピンに合わせて変更しておく。

 

スケッチを書き込んで数分するとトップぺージに数値が

">"を押すとグラフが表示される・・・

 

 

Webiopiを使ってブラウザからラズパイのGPIOを制御する

Kです。

ラズパイのWebiopiというものでブラウザからGPIOを制御できるようなので試してみました。

 

ラズパイのブラウザmidoriから

http://webiopi.trouch.com/DOWNLOADS.html

にアクセスしてwebiopiをダウンロードします。.gzファイルに圧縮されています。

installationのページにあるように、ターミナルを開いて

tar xvzf WebIOPi-x.y.z.tar.gz
cd WebIOPi-x.y.z
sudo ./setup.sh

と入力するとインストールが始まります。

途中Do you want to access WebIOPi over Internet? [y/n]と聞かれましたがnにしておきました。

インストールが終わったら一度再起動をしてターミナルを開いて

sudo /etc/init.d/webiopi start

と入力するとスタートします。

 

ifconfigでラズパイのIPアドレスを調べて、(私の環境では192.168.0.6でした)

同じLANに接続したiphoneのブラウザに

192.168.0.6:8000

と入力すると、ユーザー名とパスワードを要求されるので

初期設定(installationのページにあります)の

ID:webiopi

PASS:raspberry

を入力すると下のような画面が出てきます。

GPIO Headerを選択すると下のような画面が出てきます。

GPIO11(23pin)にLEDを接続して、

23と書いてある部分をタップすると・・・

 

23の周りがオレンジ色になり、LEDが点灯しました!

 

 

 

 

ラズベリーパイでCSVに温度湿度を記録する

Kです

Qiita RaspberryPiで脈拍データをCSV出力(CSV出力)
というページを見かけたのでテストしてみました。

pythonにはcsvを扱うモジュールがあるようなのでそこそこ簡単にcsvファイルの操作ができるようです。

ただまだプログラミングに慣れておらずモジュールの扱いもわからないので・・・
とりあえず先ほどのQiitaのページのサンプルを改変してテストしました。


--スケッチ--
import csv
from time import sleep
import Adafruit_DHT

sensor = Adafruit_DHT.DHT11
pin = 4
cnt = 0
f = open("data.csv","w")

try:
while True:
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
t = str(temperature)
h = str(humidity)
th = [t, h]
print(th)
writer = csv.writer(f, lineterminator="\n")
writer.writerow(th)
sleep(10)

except KeyboardInterrupt:
print("end")
f.close()
pass
--終わり--

ハードはこの記事で使ったDHT11を使っています。
writer.writerow()で配列をcsvファイルに書き込んでいくようですね。
配列の作り方はもっと簡単にできるかもしれません・・・。


このスケッチを実行するとIDLEに下のように温度湿度が書き込まれて、


同じフォルダにdata.csvが作成されて
無事にカンマ区切りのデータで記録されていました。



あと、下の本によると
トランジスタ技術 2016年 9月号/CQ出版

¥1,000
Amazon.co.jp

ラズベリーパイに3Gドングルを刺せば3gで通信ができるようです。
現在雑誌トランジスタ技術のサイトから先着100セット限定で半額頒布しているようです。

もし昔雑誌についてきた500MBまで無料のsimカードが使えるのであればかなり遊べそうですね・・・

ラズベリーパイでシリアル通信

ラズパイでシリアル通信を試してみました。

通信相手は秋月シリアル変換基板を接続したESP-WROOM02です。
今回はUSBシリアル変換でシリアル通信をします。
シリアル変換はFTDIチップを使っていたので、
街角のリブロガーさんの記事
http://ivis-mynikki.blogspot.jp/2015/02/raspberry-piftdi.html

を参考にインストールしました。

スケッチは
3DプリンターのJAPANESE MAKERSさん
http://www.japanese-makers.com/archives/633

のスケッチをそのまま使用しました。

ラズパイの操作は
c-bata webさん
http://nwpct1.hatenablog.com/entry/2013/10/18/124844

を参考にポートを変更して試しました。

WindowsではCOMxを選択していましたが、linux計ではttyACMx,ttyUSBxなどになるようです。
ポートの確認方法はUSBを接続した状態でターミナルにdmesgと入力すると出てきます。
dmesgだけだと長すぎるのでdmesg | tail でもよいようです。




c-bata webさんの記事を参考にして、
したの画像のように入力すると、
ser.write('o')
を入力したときにLEDがON、
ser.write('p')を入力するとLEDがoffになりました。


1 | 2 | 3 | 4 | 5 | 最初次のページへ >>