Author Archives: chen

ESP32 (2) SSD1306 & Clock

Published by:

目的

SSD1306に時刻を表示するプログラム。

ESP8266と違って、SCL,SDAを探すも一苦労。

  • I2C0 – SDA,SCL = 21,22

**2019/9/2 注意:Adafruit_SSD1306関数の引数順番変更により、関連プログラムが影響する。

もともと次のような1行ものが、

// Adafruit_SSD1306 display(OLED_RESET);

次の数行に変わる。

// OLED Setting
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels

// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

なぜ互換性ないの引数順にするね?!どうしてもしたいならば、コンパイルエラーを出す方法で、修正を促す。

以前のプログラムが再検証するところ、エラーがなし、書き込みも成功、しかしOLEDが表示ない!困った。

ハードウェア故障?ソフトウェアバージョン問題?色々と検討して、数日無駄の末、やっと引数順変わったとわかった。Adafruitひどい!

ハードウェア

「DOIT ESP32 DEVKIT V1」が幅が広いから、ブレッドボードは片側しか空いてない。結線は、片側で間にってよかった。

「ESPDUINO-32」の場合も動作する

ソフトウェア

参考1のそのまま

#include <WiFi.h>
#include <time.h>

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// OLED Setting
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#if (SSD1306_LCDHEIGHT != 32)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

// WiFi Setting
#define WIFI_SSID   "uislab003"
#define WIFI_PASSWORD   "nihao12345"
#define JST     3600*9

void setup() {
  Serial.begin(115200);
  delay(100);
  Serial.print("\n\nReset:\n");

  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3C (for the 128x32)
  // Clear the buffer.
  display.clearDisplay();
  display.setTextColor(WHITE);

  // WiFi starting
  drawLog("WiFi connecting...");
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  while(WiFi.status() != WL_CONNECTED) {
    Serial.print('.');
    delay(500);
  }
  Serial.println();
  Serial.printf("Connected, IP address: ");
  Serial.println(WiFi.localIP());
  drawLog("WiFi connected!");

  // NTP start
  configTime( JST, 0, "ntp.nict.jp", "ntp.jst.mfeed.ad.jp");
  delay(1000);
}

void loop() {
  time_t t;
  struct tm *tm;
  static const char *wd[7] = {"Sun","Mon","Tue","Wed","Thr","Fri","Sat"};
  char rdate[30], rtime[30];

  t = time(NULL);
  tm = localtime(&t);

  Serial.printf(" %04d/%02d/%02d(%s) %02d:%02d:%02d\n",
        tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday,
        wd[tm->tm_wday],
        tm->tm_hour, tm->tm_min, tm->tm_sec);
  sprintf(rdate, " %04d/%02d/%02d(%s)",
        tm->tm_year+1900, tm->tm_mon+1, tm->tm_mday, wd[tm->tm_wday]);
  sprintf(rtime, " %02d:%02d:%02d", 
        tm->tm_hour, tm->tm_min, tm->tm_sec);
  drawClock(rdate, rtime);      
  delay(1000 - millis()%1000);
}

void drawClock(const char* rdate, const char* rtime) {
  display.clearDisplay();
  display.setCursor(0,0);

  display.setTextSize(1);
  drawText(rdate);

  display.setCursor(0,13);

  display.setTextSize(2);
  drawText(rtime);

  display.display();
  delay(1);
}

void drawText(const char* text) {
  for (uint8_t i=0; i < strlen(text); i++) {
    display.write(text[i]);
  }    
}

void drawLog(const char* msg) {
  display.clearDisplay();
  display.setCursor(0,0);
  display.setTextSize(1);
  drawText(msg);

  display.display();
  delay(1);
}

 

参考

  1. https://qiita.com/nori-dev-akg/items/bbe269d1d1bf1826532a

ESP32 (1) Blink

Published by:

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 を選択.

Lチカ用内蔵LEDがGPIO2にあるが、GPIO4に外付けLEDを繋いでやった。

プログラム

void setup() {
  pinMode(4, OUTPUT);
}

void loop() {
  digitalWrite(4, HIGH);
  delay(250);
  digitalWrite(4, LOW);
  delay(250);
}

 

 

参考

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

Setup Arduino IDE for Raspberry Pi

Published by:

インストール

ホームディレクトリの ~/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

Published by:

経緯

今まで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 for Macbook

Published by:

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

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

 

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

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

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

しかし、それはV1.1で、結果は安定しない。

  • V 1.0 —
  • V 1.1 — Github Site
  • V 1.3 — Sierra環境でインストールするとクラッシュ
    (The Version 1.3 of the driver available on the vendor’s website causes a crash on Mac OS-X Sierra. )
  • V 1.4
  • V 1.5– Wch Site

Macがクラッシュ、なかなか解決策見つからないのため、かなりモチベーションに影響する。

CP2102のドライバー(Mac)

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

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

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

参考

  1. https://kig.re/2014/12/31/how-to-use-arduino-nano-mini-pro-with-CH340G-on-mac-osx-yosemite.html
  2. https://macsbug.wordpress.com/2016/01/21/ch340g-usb-serial-module/

Setup Arduino IDE for Windows

Published by:

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

Published by:

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

Published by:

経緯

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);
}

結果

うまくいく!

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

参考

 

http://henrysbench.capnfatz.com/henrys-bench/arduino-voltage-measurements/arduino-ads1115-differential-voltmeter-tutorial/

Arduino NANO (6) Heart rate sensor

Published by:

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