2021年4月 8日 (木)

Arduinoで作ろう(52) 磁気センサと電磁石を使って空中浮遊(2)

202104081

 一昨年,Arduinoで作ろう(22)秋月のホールセンサを使って「空中浮遊」をやってみましたが,智恵さんのWebサイトに刺激され,ホールセンサを別のものに取り換えてみたところ,70g程度の質量のモノを浮かせるようになりました。
Amazonで買った UGN3503 というホールセンサで,503 341という刻印があります。智恵さんがお使いになったものとは型番が少し異なるようです。
503341

 回路は以前のものと同じで,プログラムは智恵さんのプログラムを真似てanalogReadを高速化してみました。これでかなり安定して浮かせることができるようになりました。また,電磁石(コイルを巻いてあるボルト)は低反発ウレタンをはさんで,ゆる~く ぶら下げてあります。
電磁石を駆動するために使っているTA7291Pはかなり発熱するのでヒートシンクを取り付けました。

/* 空中浮揚 Arduino NANO
ホールセンサ UGN3503
モータドライバ TA7291P */

void setup() {
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
ADCSRA = ADCSRA & 0xf8; // 分周比を決めるビット(ADPS2:0)を000へ
ADCSRA = ADCSRA | 0x04; // 分周比16(100)をセット
//ADCSRA = ADCSRA | 0x03; // 分周比4(010)をセット
}

void loop() {
//Serial.println(analogRead(0));
if (analogRead(0)>865 ){ // 小さくすると下へ下がる
digitalWrite(2,HIGH);
digitalWrite(3,LOW);
}else {
digitalWrite(2,LOW);
digitalWrite(3,HIGH);
}
}

202104082

L298Nを使ったらもう少しパワーアップするのかな? またそのうち挑戦してみます。

| |

2020年5月 9日 (土)

micro:bit (5) スクロール時計

Microbit_scroll_clock

 以前,大阪日本橋のシリコンハウス共立で買ったmicro:bit用Breakoutボードを使ってみました。これを使うとmicro:bitが持つたくさんのGPIOを簡単に利用できるようになるので便利ですよ。マルツパーツ千石電商でも買えるようですね。

これにRTC(リアルタイムクロック)DS3231をつないで,スクロールクロックを作ってみました。(スクロールクロック,これで何度目かなw )
もちろん,Arduino IDE でスケッチを書きました。

//micro:bit スクロールクロック

#include <Wire.h>
#include <RtcDS3231.h>
#include <Adafruit_Microbit.h>
Adafruit_Microbit_Matrix microbit;
BLEPeripheral blePeripheral = BLEPeripheral();
RtcDS3231<TwoWire>
Rtc(Wire);

void setup() {
  Rtc.Begin() ;
  blePeripheral.begin();
  microbit.begin();
  //RtcDateTime compiled = RtcDateTime(__DATE__, __TIME__) ;
  //Rtc.SetDateTime(compiled) ;
}

void loop() {
  char buff[12] ;
  RtcDateTime dt = Rtc.GetDateTime() ;
  //sprintf(buff, "%04u/%02u/%02u", dt.Year(), dt.Month(), dt.Day()) ;
  //microbit.print(buff) ;
  sprintf(buff, " %02u:%02u:%02u", dt.Hour(), dt.Minute(), dt.Second()) ;
  microbit.print(buff) ;
}

| | | コメント (0)

2020年5月 7日 (木)

micro:bit (4) 温度計 

 micro:bit のダイ温度をLEDマトリクスでスクロール表示してみました。
sd_temp_get()の戻り値がセ氏温度の4倍なので,4で割ってから表示します。

//micro:bit 温度計

#include <Adafruit_Microbit.h>
Adafruit_Microbit_Matrix microbit;
BLEPeripheral blePeripheral = BLEPeripheral();
int32_t temp;

void setup() {
  Serial.begin(9600);
  blePeripheral.begin();
  microbit.begin();
}

void loop() {
  sd_temp_get(&temp);
  microbit.print(temp/4);
  microbit.print("C ");
  Serial.println(temp/4);
  delay(100);
}

| | | コメント (0)

2020年5月 5日 (火)

micro:bit (3) Arduino IDE による開発環境ができた

 昨日からの続きです。ネットで解決策を検索してJH1LHVさんのサイトを見つけました。
ココで「microbit-adv.hexをダウンロードして,micro:bitのフォルダに放り込めばよい」ということらしいので,やってみました。
20200505_1

 しかし,やはりスケッチの書き込みはできるものの,プログラムが実行されません。
んで次は「Flashing a SoftDevice」ってのをやってみました。ココに書いてあるこれ ↓ です。
20200505_2

 上の手順通り,Arduinoのスケッチが置いてあるフォルダ下に tools/nRF5FlashSoftDevice/tool/ というディレクトリを作って,toolの中に nRF5FlashSoftDevice.jarを放り込みます。
 Arduino IDEを起動して,ツール > nRF5 Flash SoftDevice をクリックします。
20200505_3

ところが,ここでエラーが出て先へ進めません。うーむ...

 またまた検索してこのサイトを見つけました。
ココs130_nRF51_201.zip をダウンロードし,展開して得られる s130_nrf51_2.0.1_softdevice.hexC:\Users\USER\AppData\Local\Arduino15\packages\sandeepmistry\hardware\nRF5\0.6.0/cores/nRF5/ SDK/components/softdevice/s130/hex/ の中へ放り込んでやればいいみたい。(僕はWindows10を使ってます)

 もう一度 Arduino IDE で ツール > nRF5 Flash SoftDevice をクリックすると,今度はうまくいきました。やれやれ。
Done_flashing_softdevice

件の matrixdemo もちゃんと動きました :)

| | | コメント (0)

2020年5月 4日 (月)

micro:bit (2) ライブラリを3つインストールしたが...

 昨日に引き続き,このサイトを参考にしながら Arduino IDE で micro:bit のプログラミングができるように環境整備中です。

 まずはBLEPeripheralライブラリのインストールです。BLE(Bluetooth Low Energy) 用のライブラリなんでしょうな。
スケッチ > ライブラリをインクルード > ライブラリマネージャ で 検索すれば見つかります。
Blep

 続いて Adafruit GFX ライブラリのインストール。これはグラフィックディスプレイ用かな。
Adafruit_gfx

 最後に Adafruit Microbit ライブラリ。LEDマトリクスとBLE用?
これを入れるとmicro:bit用のスケッチ例がたくさん入ります。
Adafruit_microbit

 さて,これで準備完了っぽいので,ファイル > スケッチ例 > Adafuruit microbit Library > matrixdemo を書き込んでみました。
ところが,書き込み自体はうまくいったのに LEDマトリクスは沈黙したまま。
なんでやねん。

| | | コメント (0)

2020年5月 3日 (日)

micro:bit (1) やっぱりArduino IDEを使いたい

20200502

 2年くらい前にmicro:bitを買ってMakeCodeエディタ を少し使ってみたのですが,〈日本語で書かれたブロック〉を組み合わせるというコーディング方法がどうにも肌に合わず,放置していました。
 今年のGWは〈外出自粛〉しててヒマなので「Arduino IDEでmicro:bitを使ってみようかな」と考え,Micro:bit with Arduinoというサイトに書いてあることをそのまんまマネしてやってみることにしました。

まず,ファイル > 環境設定 > 追加のボードマネージャのURL
https://sandeepmistry.github.io/arduino-nRF5/package_nRF5_boards_index.json をコピペしておいて,ツール > ボード > ボードマネージャnRF5を検索して見つかるNordic Semiconductor nRF5 Boardsをインストールします。(けっこう時間がかかります)
20200502image1

 これで,ツール > ボードBBC micro:bit が現れるのでこれを選択,SoftdeviceS130書込装置CMSIS-DAP とします。

20200502image3

これで準備完了。先のサイトにあるblink demoを書き込んでみました。

const int COL1 = 3; // Column #1 control
const int LED = 26; // 'row 1' led

void setup() { 
  Serial.begin(9600);
  Serial.println("microbit is ready!");
  // because the LEDs are multiplexed, we must ground the opposite side of the LED
  pinMode(COL1, OUTPUT);
  digitalWrite(COL1, LOW);
  pinMode(LED, OUTPUT);
}

void loop(){
  Serial.println("blink!");
  digitalWrite(LED, HIGH);
  delay(500);
  digitalWrite(LED, LOW);
  delay(500);
}

うまく書き込めると,一番上の写真のように左上のLEDが点滅します。
よし,今日はこれくらいで勘弁してやろうかな :)

| | | コメント (0)

2020年5月 1日 (金)

Arduinoで作ろう(51) パルスオキシメータ

Esp32max30102_

 新型コロナウイルスに感染した「軽症者」が,自宅療養中に急速に肺炎が悪化し手遅れになるケースがあるようです。
これを防ぐために,パルスオキシメータでときどき血中酸素飽和度SpO2を測定することをお勧めします。SpO2が96~99%なら大丈夫ですが,95%を下回ったら早急に医師に連絡すべきです。僕は2月にちゃんとした製品を買ってときどき測定していますが,今回はマイコンで自作してみましょう。

 MAX30102というパルスオキシメータ用のセンサを手に入れたので,ESP32につないでみました。
20200501-184622

 ライブラリはコレで,スケッチ例「Example8_SPO2」を少し書き換えて,OLEDディスプレイSSD1306に心拍数とSpO2を表示させてみました。
スケッチはこれです→ 20200501example8_spo2.ino

20200501-184503

 


| | | コメント (0)

2020年4月27日 (月)

Arduinoで作ろう(50) 温度・湿度・気圧データをBlynkで見てみる

Blynk_bme280_

 ESP32に温度・湿度・気圧センサBME280をつないで,データをBLEでスマホへ送り,Blynkで見てみました。
Blynkの画面は,なかなかカッコ良くて「ナウなヤングにバカウケ」ですなあ。
設定はこんな感じ ↓
Blynk_20200427_20200427100001

//ESP32 + BME280 -> Blynk 

#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>
#include <Wire.h>
#include "SparkFunBME280.h"
char auth[] = " あなたのAuth Token ";
BME280 sensor;
float temp,humidity,pressure;
char buff[50];

void setup(){
  Wire.begin();
  sensor.beginI2C();
  Serial.begin(9600);
  Serial.println("Waiting for connections...");
  Blynk.setDeviceName("BME280");
  Blynk.begin(auth);
}

void loop(){
  getdata();
  Blynk.run();
}

void getdata() {
  temp = sensor.readTempC() ;
  humidity = sensor.readFloatHumidity() ;
  pressure = sensor.readFloatPressure()/100 ;
}

BLYNK_READ(V0) {
  formattedFloat(temp, 1, buff);
  Blynk.virtualWrite(V0, buff);
}
BLYNK_READ(V1) {
  formattedFloat(humidity, 1, buff);
  Blynk.virtualWrite(V1, buff);
}
BLYNK_READ(V2) {
  formattedFloat(pressure, 0, buff);
  Blynk.virtualWrite(V2, buff);
}

void formattedFloat(float x, uint8_t precision, char *buff) {
  dtostrf(x, 7, precision, buff);
}

でも,ちょっと問題があって,「SuperChart」が「Live」のグラフは描いてくれるんだけど,「1h」(1時間のグラフ)を描いてくれないんですよね。いつまでたっても「No data yet」って表示されてるんですよ。アプリの不具合だと思うんだけどなあ?
20200427

| | | コメント (0)

2020年4月25日 (土)

Arduinoで作ろう(49) BLEでリモートLチカ

Blynk_lchika_

 ESP32の BLE (Bluetooth Low Energy) を使ってLチカをやってみました。
Blynkというスマホアプリを使ってESP32とスマホをBluetoothで接続し,3つのLEDをリモートから点けたり消したりします。
「それで?」というハナシですが,とりあえずBlynkを使う練習ですね。

 App StoreやGoogle PlayでBlynkをスマホにインストールしてユーザ登録したら,さっそくプロジェクトを作ります。
プロジェクト名は「L-chika」としておきましょうかね。

Blynk1

 「AUTH TOKEN」は,ESP32のスケッチに書き込みますからE-Mailボタンをタップして自分に送っておきましょう。
続けてウィジェットからボタン等の必要なパーツを選んで操作画面に並べていきます。
Blynk2

 雑な説明ですが(^^;), 触ってれば直観的に何をすればいいのか分かりますから大丈夫。

 次にESP32のスケッチを書きます。
Blynkのライブラリが必要ですから,Arduino IDEで スケッチ>ライブラリをインクルード>ライブラリを管理 と進んでライブラリマネージャでBlynkを検索すればすぐ見つかります。

//Blynk で リモートLチカ

#define BLYNK_PRINT Serial
#define BLYNK_USE_DIRECT_CONNECT
#include <BlynkSimpleEsp32_BLE.h>
#include <BLEDevice.h>
#include <BLEServer.h>
char auth[] = "あなたのAuth Token";

void setup(){
  pinMode(21, OUTPUT);
  pinMode(22, OUTPUT);
  pinMode(23, OUTPUT);
  Serial.begin(9600);
  Serial.println("Waiting for connections...");
  Blynk.setDeviceName("L-chika");
  Blynk.begin(auth);
}

void loop(){
  Blynk.run();
}


| | | コメント (0)

2020年4月22日 (水)

Arduinoで作ろう(48) GPSのデータをAmbientに投げる

20200422

 前回の装置をテザリングでスマホにつないで,GPSモジュールで得られた緯度・経度のデータを1分おきにAmbientに投げてみました。
上のがクルマに積んで近所を一周してできた地図。Ambientはこんなこともできるんですね。おもしろいなあ。

//ESP32 + GPSモジュール NEO-6M → Ambient

#include <WiFi.h>
#include "Ambient.h"
#include "TinyGPS++.h" 
#include "HardwareSerial.h"
#include "Wire.h"
#include "SSD1306.h"
const char* ssid = "無線LANのSSID";
const char* password = "パスワード";
WiFiClient client;
unsigned int channelId = 20050; // あなたのチャネルID
const char* writeKey = "123456789abcde";//あなたのライトキー
Ambient ambient;
SSD1306 display(0x3c, 21, 22); //I2Cアドレス0x3c,SDA->GPIO21,SCL->GPIO22
TinyGPSPlus gps;
HardwareSerial serial2(2); //ESP32_GPIO16->GPS_TX , ESP32_GPIO17->GPS_RX

void setup() {
  display.init();
  pinMode(2, OUTPUT);
  digitalWrite(2, LOW);
  Serial.begin(9600);
  Serial.println("Start GPS... ");
  display.clear();
  display.drawString(0,0,"Start GPS... ");
  display.display();
  serial2.begin(9600);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to ");
  Serial.println(ssid);
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  ambient.begin(channelId, writeKey, &client);
}

void loop() {
  if (serial2.available()){
  char c = serial2.read();
  gps.encode(c);
    if (gps.location.isUpdated()) {
     digitalWrite(2, HIGH);
     Serial.print("LAT: "); Serial.println(gps.location.lat(), 9);
     Serial.print("LONG: "); Serial.println(gps.location.lng(), 9);
     display.clear();
     display.drawString(0,0,String(gps.time.hour()+9)+":"+String(gps.time.minute())+":"+String(gps.time.second())+" JST");
     display.drawString(0,20,"LAT : "+String(gps.location.lat(),9));
     display.drawString(0,35,"LNG : "+String(gps.location.lng(),9));
     display.drawString(0,50,"ALT : "+String(gps.altitude.meters())+"m");
     display.display();
    } else{
      digitalWrite(2, LOW);
   }
 }
 if (int(millis()/1000%60) == 0){    //1分ごとに
  char buf[16];
  ambient.set(1, gps.altitude.meters());  // 標高をデータ1に
  dtostrf(gps.location.lat(), 12, 8, buf);
  ambient.set(9, buf);  // 緯度をデータ9に
  dtostrf(gps.location.lng(), 12, 8, buf);
  ambient.set(10, buf);  //経度をデータ10に
  ambient.send(); 
  }
}

| | | コメント (0)

より以前の記事一覧