All posts by chen

ESP32 (1) Setup & Blink

ESP32とは

ESP32は低コスト、低消費電力のSoCコントローラー。最大な特徴は何と言ってもWifiとBluetoothが内蔵していること。

対象デバイス

このシリーズに対象となるデバイス

  • Wemos D1 R32
  • ESP-32S

USB-UARTドライバのインストール

Silicon Labsの以下のURLからドライバをダウンロード
USB – UART ブリッジ VCP ドライバ|Silicon Labs
ドライバをインストールしたら、シリアルポート(Port): /dev/cu.SLAB_USBtoUART が現れる。

Board ManagerにESP32追加

つい最近(20180728), ESP32 用 Arduino 開発環境 Arduino core for ESP32 WiFi chip の初の安定版 1.0.0 がリリースされました. インストールする際に, コマンドラインで色々する必要はなく Arduino IDE のメニューからインストールできるようになって

https://dl.espressif.com/dl/package_esp32_index.json

Lチカのプログラム

ESP32-DevKitC を USB ケーブルで PC と接続.

Arduino IDE のメニューから  Tools – Port – /dev/cu.SLAB_USBtoUART を選択(Mac OS Xの場合).

一番単純そうなサンプルスケッチを実行する. メニューから File – Examples – (Examples for ESP32 Dev Module) – ESP32 – ChipID – GetChipID を選択.

 

参考

  1. https://qiita.com/Guwashi/items/1009faab2d3db24d80d5
  2. https://kokensha.xyz/iot/mac-esp32-and-arduino-led/

Setup Arduino IDE for Raspberry Pi

インストール

ホームディレクトリの ~/Appcations/arduinoにインストールします・

  1. ファイルマネージャを起動しホームディレクトリ(/home/[ユーザ名]配下に Applications フォルダを作ります。
  2. ブラウザを起動しhttps://arduino.cc/en/Main/SoftwareからArduino IDE Linux ARMをダウンロードします。
  3. ダウンロードしたファイル arduino-1.8.5-linuxarm.tar.xz を右クリックし
    Extract to を選択します。図1
  4. Extract files の Extract to 欄に /home/[ユーザ名]/Applicationsを入力し,
    Extractボタンをクリックします。図2
    図1 図2
  5. ターミナルを起動し次のように操作します。
    $ cd ~/Applications   ←カレントディレクトリ(作業ディレクトリ)をApplicationsに移動します
    $ ls                                 ←ファイル一覧を表示
    arduino-1.8.5
    $ ln -s arduino-1.8.5  arduino    ←シンボリックリンク arduino を作ります
    $ ls
    arduino atduino-1.8.5
    $ cd arduino        ←arduinoに移動します
    $ ls
    arduino          hardware    lib        revisions.txt  uninstall.sh
    arduino-builder  install.sh  libraries  tools
    examples         java        reference  tools-builder
    $ ./install.sh      ←インストールコマンド install.sh を実行します
    
    (警告が沢山表示されますが,無視します)
    
    done!               ←インストール終了
    $

バージョンアップ手順

例:arduino-1.8.5 –> arduino-1.8.6

  1. 前述「インストール手順」2〜4に倣って新バージョンをダウンロードし展開します。
  2. 次の操作でシンボリックリンクの張り替えと旧バージョンの削除を行います。
    $ ln -sf arduino-1.8.6  arduino 
    $ rm -rf arduino-1.8.5

参考

  1. Arduino IDEの動作環境設定ファイルやボードマネージャでインストールした追加ボードのファイル群は ~/.arduino15 フォルダに収容されています。
  2. Arduino IDE付属のサンプルスケッチは~/Aplications/arduino/exampleフォルダに収容されています。
  3. Arduino IDE付属のライブラリは~/Aplications/arduino/librariesフォルダに収容されています。
  4. 自分で作ったスケッチは~/Arduinoフォルダに収容されます。
  5. Arduino IDEのライブラリマネージャでインストールしたライブラリは~/Arduino/librariesフォルダに収容されています。

 

Setup Arduino IDE for Ubuntu

経緯

今までArduino IDEのMacbookまたはWindows版を利用している。ESP8266/WeMosに限って、よくクラッシュする。

同じシリアルCH340を使う、安価のUno、Nanoは普通に使えるので、シリアルドライバーではなく、WeMos、ESP8266に関する何か異変があると思う。

頻繁にクラッシュするから仕事進まないと困る。Ubuntuで安定するかを試すことに。

Arduino IDEのインストール

Linux 64 bits 版 Arduino IDE をダウンロード

https://www.arduino.cc/en/Main/Software

Arduino IDEのインストールする。ファイルの展開のみ

$ tar xvfJ arduino-1.6.7-linux64.tar.xz

CH340のドライバー(Linux)

今まで互換機を使ったことが無い方はWeMosのホームページからCH340のドライバーをインストールする必要がある。

$ sudo apt install make gcc libelf-dev

http://www.wch.cn/download/CH341SER_LINUX_ZIP.html

インストール

//compile
#make
//load ch34x chips driver
#make load
//unload ch34x chips driver
#make unload

しかし、コンバイルうまくできない。

ドライバー探す

ネットで探したら、下記の発見。

https://github.com/juliagoda/CH341SER

Gitでコードを取得する。

$ git clone https://github.com/juliagoda/CH341SER

「readme.txt」を参考にコンパイル。

$ cd CH341SER_LINUX
$ sudo make
$ sudo make load

検証

管理者権限でArduino IDE を起動。

$ sudo /opt/arduino-1.8.3/arduino

ツール>シリアルポートから、”/dev/ttyUSB0/”を選択。 ※環境によって変わる
ファイル>スケッチ例>01.Basic>Blinkを開く。
f:id:r17u:20170609073839p:plain

IDEより書き込み。端末に以下が表示され、ボード上のledが点滅したらok。

Setup Arduino IDE for Macbook

Arduino IDEのインストール

Arduino IDEがまたインストールしてないの場合、普通に、Arduino IDEのインストールする。

以下URLから、ArduinoのウェブサイトからIDEをダウンロードして、インストールする

https://www.arduino.cc/en/Main/Software

シリアル通信ドライバ

利用する開発ボードにより、下記のどちらかインストールする必要がある。

CH340のドライバー(Mac)

UNO互換機を使っている方は、特に何も必要ないが、今まで互換機を使ったことが無い方はWeMosのホームページからCH340のドライバーをインストールする必要がある。

http://www.wch.cn/download/CH341SER_MAC_ZIP.html

CP2102のドライバー(Mac)

まずシリアル変換:CP2102のため、ドライバーのインストールが必要。

Silicon Labsの以下のURLから「Mac用」ドライバをダウンロード
USB – UART ブリッジ VCP ドライバ|Silicon Labs

ドライバをインストールしたら、シリアルポート(Port): /dev/cu.SLAB_USBtoUART が現れる。

接続するとマックがクラッシュ

WeMosを接続するとマックがクラッシュ問題に数ヶ月前から悩まされている。

「参考1」によると、下記のドライバが安定するらしい。

参考

  1. https://macsbug.wordpress.com/2016/01/21/ch340g-usb-serial-module/

Setup Arduino IDE for Windows

Arduino IDEのインストール

Arduino IDEがまたインストールしてないの場合、普通に、Arduino IDEのインストールする。

以下URLから、ArduinoのウェブサイトからIDEをダウンロードして、インストールする

https://www.arduino.cc/en/Main/Software

追加デバイスドライバ

UNO互換機、WeMos、「LoLin NodeMCU」 「Amica NodeMCU」を初めて利用する場合、追加デバイスドライバのインストールが必要。

CH340のドライバー(Windows)

UNO互換機を使っている方は、特に何も必要ないが、今まで互換機を使ったことが無い方はWeMosのホームページからCH340のドライバー(CH341SER_MAC.ZIP)をインストールする必要がある。

http://www.wch.cn/download/CH341SER_ZIP.html

コントロールパネルからデバイスマネージャーを開き、ほかのデバイス>不明なデバイスを右クリック、ハードウェアの更新をクリック。

「コンピュータを参照してドライバーソフトウェアを検索します」を選択。

ダウンロードしたファイルが入っているフォルダを指定し、次へをクリックするとドライバがインストールされる。

「コンピュータの管理」ー「デバイス・マネージャー」-「ポート」で、CH430 のシリアルポートが確認できれば完成。

 

CP2102のドライバー(Windows)

 

まずシリアル変換:CP2102のため、ドライバーのインストールが必要。

Silicon Labsの以下のURLから「Windows 7/8/8.1/10用」ドライバをダウンロード
USB – UART ブリッジ VCP ドライバ|Silicon Labs
ダウンロードしたZIP(CP210x_Windows_Drivers.zip)を展開し、CP210xVCPInstaller_x64.exeを実行し、ドライバインストールを開始する。

About Arduino

Arduino とは

Arduino(アルドゥイーノ[1])は、AVRマイコン入出力ポートを備えた基板、C++風のArduino言語とそれの統合開発環境から構成されるシステム。Arduino LLC および Arduino SRL が設計・製造を行い、登録商標を持っている。

純正の基板

安定して製品、値段は少々高額になり。

  • Arduino UNO
  • Arduino NANO
  • Arduino 101

互換基板

一部純正同じ名前、外観も類似のものがある。USBドライバインストール必要。値段は安い、WiFi内臓など機能が豊富。

  • Arduino UNO (CH340)
  • Arduino NANO(CH340)
  • ESP8266 ESP-WROOM-02
  • ESP8266 NodeMcu
  • ESP8266 Wemos

Arduino NANO (7) ADS1115 for A/D

経緯

ADS1115を購入して、生体信号のAD変換に利用するつもりだが、うまくいかない( WeMos (b9) ADS1115 for A/D 参考)、正しい電圧が表示されない。

そこで、Arduino NANOのチュートリアルを探して、検証することに。

ハードウェア

ADS1115とArduino NANOはI2Cで接続。

ソフトウェア

「参考1」コードそのまま。

#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads;  // Declare an instance of the ADS1115

int16_t rawADCvalue;  // The is where we store the value we receive from the ADS1115
float scalefactor = 0.1875F; // This is the scale factor for the default +/- 6.144 Volt Range we will use
float volts = 0.0; // The result of applying the scale factor to the raw value

void setup(void)
{
  Serial.begin(9600); 
  ads.begin();
}

void loop(void)
{  

  rawADCvalue = ads.readADC_Differential_0_1(); 
  volts = (rawADCvalue * scalefactor)/1000.0;
  
  Serial.print("Raw ADC Value = "); 
  Serial.print(rawADCvalue); 
  Serial.print("\tVoltage Measured = ");
  Serial.println(volts,6);
  Serial.println();
  

  delay(1000);
}

結果

うまくいく!

電池の電圧はちゃんでシリアルモニターに表示。

参考

 

Arduino ADS1115 Differential Voltmeter Tutorial

Arduino NANO (6) Heart rate sensor

Arduinoセンサーキットに、Heart rate sensorある。

血中ヘモグロビンの近赤外線吸収の性質を利用して脈拍パルス検出するらしい。

Arduinoとの接続は3線(GND、VCC、アナログ入力)のみ。

「参考1」をみて、まず簡単の試す。ただA0の値を表示。

// Pulse Monitor Test Script
int sensorPin = 0;
void setup() {
   Serial.begin(9600);
}
void loop ()
{
   while(1)
   {
     Serial.print(analogRead(sensorPin));
     Serial.print('\n');
   }
}

指先センサー装着

シリアルプロッターに見える上昇カーブ

安定した状態これはなにもわからない

指はセンサーから離れる時の下降カーブ。

「参考1」を参考して、Smoothingしても、同じ判別不能。困った。

#define samp_siz 4
#define rise_threshold 5
// Pulse Monitor Test Script
int sensorPin = 0;
void setup() {
   Serial.begin(9600);
}
void loop ()
{
   float reads[samp_siz], sum;
   long int now, ptr;
   float last, reader, start;
   float first, second, third, before, print_value;
   bool rising;
   int rise_count;
   int n;
   long int last_beat;
   for (int i = 0; i < samp_siz; i++)
     reads[i] = 0;
   sum = 0;
   ptr = 0;
   while(1)
   {
     // calculate an average of the sensor
     // during a 20 ms period (this will eliminate
     // the 50 Hz noise caused by electric light
     n = 0;
     start = millis();
     reader = 0.;
     do
     {
       reader += analogRead (sensorPin);
       n++;
       now = millis();
     }
     while (now < start + 20);  
     reader /= n;  // we got an average
     // Add the newest measurement to an array
     // and subtract the oldest measurement from the array
     // to maintain a sum of last measurements
     sum -= reads[ptr];
     sum += reader;
     reads[ptr] = reader;
     last = sum / samp_siz;
     // now last holds the average of the values in the array
     // check for a rising curve (= a heart beat)
     if (last > before)
     {
       rise_count++;
       if (!rising && rise_count > rise_threshold)
       {
         // Ok, we have detected a rising curve, which implies a heartbeat.
         // Record the time since last beat, keep track of the two previous
         // times (first, second, third) to get a weighed average.
         // The rising flag prevents us from detecting the same rise 
         // more than once.
         rising = true;
         first = millis() - last_beat;
         last_beat = millis();
         // Calculate the weighed average of heartbeat rate
         // according to the three last beats
         print_value = 60000. / (0.4 * first + 0.3 * second + 0.3 * third);
         Serial.print(print_value);
         Serial.print('\n');
         third = second;
         second = first;
       }
     }
     else
     {
       // Ok, the curve is falling
       rising = false;
       rise_count = 0;
     }
     before = last;
     ptr++;
     ptr %= samp_siz;
   }
}

こんな図形になって、周囲の雑音とか酷いかな?

参考:

  1. https://www.hackster.io/Johan_Ha/from-ky-039-to-heart-rate-0abfca

Arduino NANO (5) MAX30102 Pulse Ox Sensor

試み

MAX30102 というPulse Ox Sensorを利用して、脈拍と酸素濃度を測る試み。

MAX30100の実例が多いが、MAX30102の実例が少ない。

プログラム

「参考1」のSparkFunのライブラリを利用する。そのライブラリはMAX30105(R,G,IR LED)用だが、MAX30102(欠Green LED)でも利用できる。

OLED表示するため、「参考2」の表示部分を合体した。なんとなく、バグがある様な気がする。

// Sample implementation of the MAX30100 PulseOximeter
// Using the following module
// http://www.ebay.com/itm/-/391709438817?ssPageName=STRK:MESE:IT
// can not gaurantee if the app will work with other implementations of the module. 

//#include "MAX30100_PulseOximeter.h"
#include <U8g2lib.h>
#include <Wire.h>
#include "MAX30105.h"
#include "heartRate.h"

#define REPORTING_PERIOD_MS     500

 U8G2_SSD1306_128X32_UNIVISION_F_HW_I2C u8g2(U8G2_R0);

// PulseOximeter is the higher level interface to the sensor
// it offers:
//  * beat detection reporting
//  * heart rate calculation
//  * SpO2 (oxidation level) calculation
//PulseOximeter pox;
MAX30105 particleSensor;

const byte RATE_SIZE = 4; //Increase this for more averaging. 4 is good.
byte rates[RATE_SIZE]; //Array of heart rates
byte rateSpot = 0;
long lastBeat = 0; //Time at which the last beat occurred

float beatsPerMinute;
int beatAvg;

//byte pulseLED = 13; //Must be on PWM pin
//byte readLED = 11; //Blinks with each data read
//
bool calculation_complete=false;
bool calculating=false;
bool initialized=false;
byte beat=0;

void show_beat() 
{
  u8g2.setFont(u8g2_font_cursor_tf);
  u8g2.setCursor(8,10);
  if (beat==0) {
    u8g2.print("_");
    beat=1;
  } 
  else
  {
    u8g2.print("^");
    beat=0;
  }
  u8g2.sendBuffer();
}

void initial_display() 
{
  if (not initialized) 
  {
    u8g2.clearBuffer();
    show_beat();
    u8g2.setCursor(24,12);
    u8g2.setFont(u8g2_font_profont15_mr);
    u8g2.print("Place finger");  
    u8g2.setCursor(0,30);
    u8g2.print("on the sensor");
    u8g2.sendBuffer(); 
    initialized=true;
  }
}

void display_calculating(int j)
{
  if (not calculating) {
    u8g2.clearBuffer();
    calculating=true;
    initialized=false;
  }
  show_beat();
  u8g2.setCursor(24,12);
  u8g2.setFont(u8g2_font_profont15_mr);
  u8g2.print("Measuring..."); 
  u8g2.setCursor(0,30);
  u8g2.print(beatsPerMinute);
  u8g2.print(" Bpm");
  u8g2.sendBuffer();
}

void display_values()
{
  u8g2.clearBuffer();
  u8g2.setFont(u8g2_font_profont15_mr);
 
  u8g2.setCursor(0,30);
  u8g2.print(beatsPerMinute);
  u8g2.print(" Bpm _ ");
  u8g2.setCursor(65,30);  
  u8g2.print(beatAvg);
  u8g2.sendBuffer();
}

void setup()
{
    Serial.begin(115200);
    
//    pinMode(pulseLED, OUTPUT);
//    pinMode(readLED, OUTPUT);

    u8g2.begin();

    // Initialize sensor
    if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed
    {
      Serial.println(F("MAX30105 was not found. Please check wiring/power."));
      while (1);
    }    

    particleSensor.setup(); //Configure sensor with default settings
    particleSensor.setPulseAmplitudeRed(0x0A); //Turn Red LED to low to indicate sensor is running
    particleSensor.setPulseAmplitudeGreen(0); //Turn off Green LED
    
    initial_display();
}


void loop()
{

  long irValue = particleSensor.getIR();
  float temperature = particleSensor.readTemperature();
//  digitalWrite(readLED, !digitalRead(readLED)); //Blink onboard LED with every data read

  if (checkForBeat(irValue) == true)
  {
    calculation_complete=true;
    calculating=false;
    initialized=false;

//    digitalWrite(pulseLED, !digitalRead(pulseLED)); //Blink onboard LED with every Beat
    //We sensed a beat!
    long delta = millis() - lastBeat;
    lastBeat = millis();

    if (delta < 10000) {
      beatsPerMinute = 60 / (delta / 1000.0);
    } else {
      calculation_complete=false;
      beatsPerMinute=0;
      initial_display();
    }
    
    if (beatsPerMinute < 255 && beatsPerMinute > 20)
    {
      rates[rateSpot++] = (byte)beatsPerMinute; //Store this reading in the array
      rateSpot %= RATE_SIZE; //Wrap variable

      //Take average of readings
      beatAvg = 0;
      for (byte x = 0 ; x < RATE_SIZE ; x++)
        beatAvg += rates[x];
      beatAvg /= RATE_SIZE;
      display_values();
    }
  } else {
    if (irValue < 50000) {
      calculating=false;
      initial_display();
    } else {
      display_calculating(5);
    }
  }

  Serial.print("IR=");
  Serial.print(irValue);
  Serial.print(", BPM=");
  Serial.print(beatsPerMinute);
  Serial.print(", Avg BPM=");
  Serial.print(beatAvg);
  Serial.print(", initialized=");
  Serial.print(initialized);
  Serial.print(", calculating=");
  Serial.print(calculating);
  Serial.print(", calculation_complete=");
  Serial.print(calculation_complete);
  Serial.println();



}

 

実験

かなり不安定の感じがする。

 

一応、形はできたが、

しかし、脈拍捉えるのは稀て、今回も失敗して。。。

参考

  1. https://learn.sparkfun.com/tutorials/max30105-particle-and-pulse-ox-sensor-hookup-guide
  2. https://www.hackster.io/umar-sear/arduino-heart-rate-monitor-a8e9e1
  3. https://www.hackster.io/AAKS/max30100-and-blynk-0f58f4