SSブログ

Arduinoで温度を測る [Arduino]

Arduinoで温度を測ります!
使うのは、温度センサの「LM61BIZ」です。

これです↓
高精度IC温度センサLM61BIZ
高精度IC温度センサ(LM61).JPG
※以前に秋月電子で購入したのですが、メーカ都合により現在では販売されていないようです。
TI社の半導体製品が生産終了でないのに在庫限りです。どうしてですか?/TIのIC単体を購入できませんがどうしてですか?
"https://akizukidenshi.com/catalog/faq/goodsfaq.aspx?goods=I-09691"

【配線図】
Arduino_温度センサ_ブレッドボード.jpg

【スケッチ】
データシートを見ると
 Vo = (+10mV/℃ × T℃)+ 600mV
とありますので、温度T℃を求めるためには、
 T℃ = (Vo - 0.6[V]) / 0.01[V]
で求まります。

スケッチは以前に赤外線測距センサで作成したものを少し修正すればOKです。
/*
  AnalogReadSerial

  Reads an analog input on pin 0, prints the result to the Serial Monitor.
  Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu).
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/AnalogReadSerial
*/
/*******************************************************************************
温度センサ(LM61BIZ) サンプルプログラム
++++++ note ++++++
・温度センサ LM61BIZ
・測定した温度をコンソール画面に表示するプログラム
・測定範囲:-25℃~+85℃

*******************************************************************************/
const float Vcc = 3.3;                   //電源電圧(定数)
float temp_volt;                         //出力電圧
float temp_data;                         //温度

// the setup routine runs once when you press reset:初期化(電源投入/リセット時1回のみ実行)
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);                    //9600bpsでシリアルポートを開く
}

// the loop routine runs over and over again forever: main loop
void loop() {
  int sensorValue = analogRead(A0);      //read the input on analog pin 0:
  temp_volt = Vcc * sensorValue / 1023;  //アナログピンから読み取った値を元の出力電圧値に戻す

// 出力電圧から温度データを作成
  temp_data = (temp_volt - 0.6) / 0.01;  //【データシート】T[℃] = (Vo - 0.6) / 0.01

// 温度データの表示 temp_dataの値をハード・シリアルへ出力する(Arduino→PCモニタ)
  Serial.print(temp_data);               //温度を表示
  Serial.println("[℃]");                //単位は℃
  delay(1000);                           //1秒単位(シリアルポートを溢れさせないように) ※delay():単位ms
}




profile_picture_40×40.JPG
nice!(0)  コメント(0) 

ArduinoでGPS情報を取得する [Arduino]

SDカードシリーズはいろいろと物品調達の準備があるため、その間に別のことやりたいと思います。
”ArduinoでGPS情報を取得する”です。
これもいずれはやっておきたかったことなので、このタイミングで試してみたいと思います。

GPSモジュールは秋月電子のを使います。
ググると、たくさんの製作記事がヒットするので情報には困らないと思います。

GPS受信機キット 1PPS出力付き「みちびき」3機受信対応
秋月電子 GPS受信機キット 1PPS出力付き 「みちびき」対応.JPG
"https://akizukidenshi.com/catalog/g/gK-09991/"

GPSモジュールの電源は5Vですが、データIOは3.3Vです。そのため今回はArduino Pro Mini(3.3V, 8MHz)を使います。

【配線図】
Arduino Pro Mini_GPSモジュール_ブレッドボード.jpg

Arduino Pro Mini-GPSモジュール配線.JPG
【スケッチ】
最初にGPSモジュールからの情報をコンソール画面に表示する、サンプルスケッチを試してみます。
Arduino IDEから
ファイル>スケッチ例>SoftwareSerial>SoftwareSerialExample
シアルポートのデータ転送レートを変更しています。
もちろん、シリアルモニタともデータ転送レートは一致させるのですが、9600以外では文字化けしてしまい、うまく表示することが出来ませんでした。
/*
  Software serial multple serial test

 Receives from the hardware serial, sends to software serial.
 Receives from software serial, sends to hardware serial.

 The circuit:
 * RX is digital pin 10 (connect to TX of other device)
 * TX is digital pin 11 (connect to RX of other device)

 Note:
 Not all pins on the Mega and Mega 2560 support change interrupts,
 so only the following can be used for RX:
 10, 11, 12, 13, 50, 51, 52, 53, 62, 63, 64, 65, 66, 67, 68, 69

 Not all pins on the Leonardo and Micro support change interrupts,
 so only the following can be used for RX:
 8, 9, 10, 11, 14 (MISO), 15 (SCK), 16 (MOSI).

 created back in the mists of time
 modified 25 May 2012
 by Tom Igoe
 based on Mikal Hart's example

 This example code is in the public domain.

 */
/*******************************************************************************
GPSテスト用シリアル通信プログラム
++++++ note ++++++
・Arduino Pro Mini使用
・スケッチデフォルトのボーレートで動作させると、GPSからの信号が文字化けする。
⇒ボーレートを9600に変更(落とす)するとOK

*******************************************************************************/
#include 

SoftwareSerial mySerial(10, 11); // RX, TX

void setup() {
  // Open serial communications and wait for port to open:
  //Serial.begin(57600);
  Serial.begin(9600); //ハードシリアルポートのデータ転送レートを9600bpsに設定
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.println("Goodnight moon!"); //ハードシリアルポートから文字列出力

  // set the data rate for the SoftwareSerial port
  //mySerial.begin(4800);
  mySerial.begin(9600); //ソフトシリアルポートのデータ転送レートを9600bpsに設定
  mySerial.println("Hello, world?"); //ソフトシリアルポートから文字列出力
}

void loop() { // run over and over
  if (mySerial.available()) { //もしソフトシリアルポートにデータあるならば
    Serial.write(mySerial.read());  //ソフトシリアルポートで読み込んだデータを
                                    //ハードシリアルポートに対して出力する
  }
  if (Serial.available()) { //もしハードシリアルポートにデータがあるならば
    mySerial.write(Serial.read()); //ハードシリアルポートで読み込んだデータを
                                    //ソフトシリアルポートに対して出力する
  }
}

電源を入れるとLEDが点灯してGPSを捕捉し始めます。
コールドスタートと言って、まっさらな状態からだと40~90秒くらいでGPSを捕捉するようです。捕捉できたらLEDは1秒周期で点滅を始めます。
キットに付属のソフトウェア(MiniGPS)でデータを受けると、捕捉したGPSの数や緯度経度、時刻とかの情報を表示させることができます。
MiniGPSモニタ.jpg


profile_picture_40×40.JPG
nice!(0)  コメント(0) 

ArduinoでSDカードにファイルを読み書きする [Arduino]

ArduinoからSDカードの情報を取得できたので、
#ArduinoでSDカード情報を取得する
次にArduinoからSDカードへファイルの読み書きをしたいと思います。
ブレッドボードの配線は同じで、スケッチだけ変えます。

【スケッチ】
SDカードにファイルを読み書きする、サンプルスケッチを試してみます。
Arduino IDEから
ファイル>スケッチ例>SD>ReadWrite
スケッチのCS(SS)ピン番号を4→10に変更しています。
/*
  SD card read/write

  This example shows how to read and write data to and from an SD card file
  The circuit:
   SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)

  created   Nov 2010
  by David A. Mellis
  modified 9 Apr 2012
  by Tom Igoe

  This example code is in the public domain.

*/
/*******************************************************************************
テスト用SDカードリードライトプログラム
++++++ note ++++++
・Arduino Pro Mini用にSSピンを変更
・SDカードにテキストファイルを読み書きするプログラム

*******************************************************************************/
#include 
#include 

File myFile;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("Initializing SD card...");

  if (!SD.begin(10)) { //4→10に変更
    Serial.println("initialization failed!");
    while (1);
  }
  Serial.println("initialization done.");

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  myFile = SD.open("test.txt", FILE_WRITE);

  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
    // close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }

  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
}

void loop() {
  // nothing happens after setup
}

最初にシリアルモニタを立ち上げたときに1行目が記入され、以降、Arduino Pro Miniボードのリセットボタンを押すごとに"testing 1, 2, 3."の文字列が1行ずつ増えています。
Arduino Pro Mini_SDカードファイ読み書き.jpg



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Raspberry Pi3【IPアドレス固定化】 [Raspberry Pi]

Raspberry Piをリモートデスクトップ接続できるようにしたのですが、
#Raspberry Pi3【初期設定⑧】リモート接続OK・・・xdrp 接続
Raspberry PiのIPアドレスの設定はデフォルトでDHCPとなっています。そのため、都度、IPアドレスが変わってしまう可能性があります。
これではリモート(デスクトップ)接続の際に、”IPアドレスは何だろう?”と調べるのは手間です。
なので、”IPアドレスを固定にしてしまいましょう”ということになります。

ネットワークは有線LANと無線LANの両方ありますので、2つとも固定化したいと思います。

【動的IPと固定IPの混在】
自宅でのインターネット構築では、1台のルータがDHCPサーバを兼ねていることが多いと思います。
設定もだいたいデフォルトで使うでしょうから、基本的にはネットワークアドレス全体においてDHCPサーバから動的にIPアドレスが割り当てられる状態だと思います。

DHCPサーバからの動的IPアドレスと手動設定の固定IPアドレスを混在するにどうしたらよいでしょうか。。。
簡単に言うと”ネットワークアドレスの範囲を2つの領域に分けてしまおう!”、ということになります。
 ・DHCPサーバから動的IPアドレスが割り当てられる範囲
 ・手動で固定IPアドレスを割り当てる範囲

例えば、サブネットマスク/24のネットワークでは、253個のIPアドレスを割り当てることができますが、
 ・2~100(99個):動的IPを割り当てる範囲
 ・101~254(154個):固定IPアドレスを割り当てる範囲
というように分割してしまえばいいわけです。

この辺りの分割の個数は、何を何台繋げるかによって変わってきますし、DHCPの設定の仕方もルータ(DHCPサーバ)の機器によって違うと思いますので、取扱説明書を参照して設定してみてください。

【dhcpcd設定ファイルの編集】
テキストエディタで、IPアドレス、サブネットマスク、デフォルトゲートウェイ、DNSサーバアドレスを追記します。
interface eth0(又はwlan0)
 static ip_address=[設定したい固定IPアドレス]/24
 static routers=[デフォルトゲートウェイのIPアドレス]
 static domain_name_servers=[DNSサーバーのIPアドレス]

 $sudo nano /etc/dhcpcd.conf
  interface eth0
  static ip_address=192.168.x.xx/24
  static routers=192.168.x.x
  static domain_name_servers=192.168.x.x

  interface wlan0
  static ip_address=192.168.x.xx/24
  static routers=192.168.x.x
  static domain_name_servers=192.168.x.x

【ネットワーク・インターフェースを再起動】
 $sudo ifconfig eth0 down
 $sudo ifconfig eth0 up
 $sudo ifconfig wlan0 down
 $sudo ifconfig wlan0 up

【設定反映の確認】
デスクトップ画面最上部のツールバーの右側にネットワークアイコンがあります。
アイコンにマウスを当て、右クリックで「Wireless & Wired Network Setting」を表示させます。
プルダウンを利用して
Confingue:interface eth0/wlan0
を表示させて、
 IPv4 Address:
 Router:
 DNS Servers:
に先ほど設定したアドレス値が反映されていればOKです。
なお、最初のDHCPの場合には、
Automatically configure empty options のチェックボックスにチェックが入っており、アドレスのボックスは空欄になっています。
Raspberry Pi IPアドレス固定化.jpg



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Raspberry Pi3【日本語環境の整備】 [Raspberry Pi]

次に日本語環境を整備します。

これも前回とほぼ同じなのですが、
#Raspberry Pi3【初期設定①】環境設定と日本語環境の整備
日本語入力ソフトとしてFcitx-Mozc(ファイティクス-モズク)を採用してみたいと思います。
#前回がIbus-Mozcだったので、変えてみようというノリです。なので使ってみて使い勝手が悪そうであれば、Ibus-Mozcにこっそり変更しているかもしれません。。。

【日本語フォントのインストール】
日本語フォントを選択
 fonts-takao
 fonts-ipafont-gothic
 fonts-ipafont-mincho
 fonts-noto
前回同様に、Notoを選択
 ①Mune >設定 >Add / Remove Software
 ②notoで検索 >「metapackage to pull Note fonts」をチェック(選択する)
 ③Applyでインストール (複数のパッケージをチェックして一括インストールできる)
  rootを選択してパスワードを入力してインストール

【日本語入力ソフトのインストール】
GUI画面で「Add / Remove Software」からインストールできると思いますが、それも前回やったので、今回はコマンドベースでインストールしてみます。

まず、パッケージリストを最新にします。
 $ sudo apt-get update
パッケージリストを最新にしたら、fcitx-mozcパッケージをインストールします。
 $ sudo apt-get install fcitx-mozc

インストールが完了したら、再起動します。

【Fcitx設定】
Mune >設定 >Fcitx設定 で”入力メソッドの設定”の画面が出てきます。
「全体の設定」タブでホットキーとして”入力メソッドのオンオフを何で行うのか、という設定がありますが、最初から
 Ctrl+Space
 Zenkakuhankaku
が設定されています。私は以前よりCtrl+Spaceを使っているので、特に変更の必要がなかったです。

【日本語と英語の切り替え】
日本語と英語の切り替えはCtrl+Spaceで切り替えます。

Text Editorテキストエディタを立ち上げて、日本語と英語の切り替えと日本語入力ができればOKです。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Raspberry Pi3【セキュリティ対策】パスワード変更/ユーザ追加 [Raspberry Pi]

過去記事を参考に、パスワード変更/ユーザ追加とpiユーザをsudoグループから削除して、セキュリティ対策をしていきます。
#Raspberry Pi3【初期設定②】パスワード変更/ユーザ追加

===================================
【rootパスワード設定】
 ①ラズパイの端末を開く
 ②rootユーザのパスワードを設定
  $sudo passwd root
   新しい UNIX パスワード入力してください:****
   新しい UNIX パスワード再入力してください:****
   passwd: パスワードは正しく更新されました
 ③ ②で設定したパスワードでログインできるか確認
  su -   :/root配下でrootになる
  su root :そのディレクトリでrootになる
 ④rootユーザをログアウト
  exit

【ユーザ追加作業】
 ①新しく「hoge」というユーザを追加
  $sudo adduser hoge
   ユーザ ’hoge’を追加しています...
   新しいグループ ’hoge’(1001)を追加しています...
   新しいユーザ ’hoge’(1001)をグループ ’hoge’として追加しています...
   ホームディレクトリ ' /home/hoge'を作成しています...
   ' /etc/skel'からファイルをコピーしています...
    新しい UNIX パスワード入力してください:****
    新しい UNIX パスワード再入力してください:****
    passwd: パスワードは正しく更新されました
   hogeのユーザ情報を更新中
   新しい値を入力してください。標準設定値を使うならリターンを押してください
     フルネーム[ ]:
     部屋番号[ ]:
     職場電話番号[ ]:
     自宅電話番号[ ]:
     その他[ ]:
   以上で正しいですか?[Y/n] →Y
 ②追加したユーザ(hoge)をsudoグループを追加
 デフォルトでsudoグループがsudoerになっているのでグループを追加するだけでOK
  $sudo gpasswd -a hoge sudo
   ユーザ ’hoge’をグループ sudo に追加

【piユーザをsudoグループから外す】
piユーザはRaspberry Piのデフォルトユーザでありパスワードも含めて幅広く公開されていることから、このままの状態ではセキュリティの脆弱ポイントとなってしまいます。
そのためパスワード変更とsudoグループから外します。
 ①piユーザのパスワードを変更
  $sudo passwd pi
    新しい UNIX パスワード入力してください:****
    新しい UNIX パスワード再入力してください:****
    passwd: パスワードは正しく更新されました
 ②piユーザをsudoグループから外す
  $sudo gpasswd -d pi sudo
   ユーザ ’pi’をグループ sudo から削除

 ③「/etc/sudoers」を編集 nanoコマンドで「sudors」を開く
  $sudo nano /etc/sudoers
 ④piユーザはパスワードなしのsudo権限がある
 下記の行を「#」でコメントアウトしてsudoersから除外する
  /etc/sudoers
  #pi ALL=(ALL) NOPASSWD: ALL
  ⇒自分の設定ファイルにはもともとなかったので、特に実施していません。

【piユーザの自動ログイン無効化】
起動時にpiユーザで自動ログインしてしまうので、無効化します。
 ①「/etc/lightdm/lightdm.conf」を編集 nanoコマンドで「lightdm.conf」を開く
  $sudo nano /etc/lightdm/lightdm.conf
 ②下記の行を「#」でコメントアウトしてpiユーザの自動ログインを無効化する
  #autologin - user = pi

ここでリブートして再ログインしたときにpiユーザで自動ログインされないことを確認できましたが、ネットで気になる記載があったので、念のため追加でやっておきます。
 ①「etc/systemd/system/autologin@.service」を編集 nanoコマンドで「autologin@.service」を開く
  $sudo nano /etc/systemd/system/autologin@.service
 ②下記の行を「#」でコメントアウト
  # ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Raspberry Pi3【OSインストール】Raspberry Pi OSダウンロード~Raspberry Piの起動 [Raspberry Pi]

【Raspberry Pi OSダウンロード】
3年前にRaspberry Pi3(MODEL B)に『Raspbian(ラズビアン)』をインストールして起動しましたね。
あれからもう3年ですかー、早いですね。。。
正直、その後あまり活用方法もなく、コロンっと机の端で埃を被っていたPi3ですが、この度、再起動させたいと思います。

と、思ったところでいろいろと変わっていました。
すでにPi4は発売され、OSも『Raspberry Pi OS』と名称が変わっていました。。。

RaspberryPiのサイトからRaspberry Pi OSをダウンロードします。
 https://www.raspberrypi.org/

Raspberry Pi OS(以前はRaspbianと呼ばれていました)は、公式にサポートされているオペレーティングシステムです。

Raspberry Pi OS DLサイト.jpg
※英語サイトですが、google翻訳で表示しています。

画面にあるように、Raspberry Pi Imagerを使用してRaspberryPiOSをインストールします。
最初に、Raspberry Pi Imagerをダウンロードします。私はWindowsを使っているので、Windows版をダウンロードします。
これまでのNOOBS v2.4.5(2017.11.29)では1.5GBのファイルサイズがあり、ダウンロードにもそれなりの時間がかかっていましたが、imager_1.5(2020.12.29)では20MB弱なのですぐにダウンロードできます。

【Raspberry Pi Imager】
では、やってみましょう。
Raspberry Pi ImagerをPCにインストールします。インストール先は選択できないようです。

 ①microSDカードをPCに接続して、Raspberry Pi Imagerを実行します。
RaspberryPi Imager①.jpg
 ②OSを選択します。
RaspberryPi Imager②.jpg
 ③microSDカードを選択します。
RaspberryPi Imager③.jpg
 ④microSDカードに書き込みます。
RaspberryPi Imager④.jpg
RaspberryPi Imager⑤.jpg
大体15分弱くらいで、完了画面が出ました。
RaspberryPi Imager⑥.jpg

【Raspberry Piの起動】
 ①OSを書き込んだmicroSDカードをカードスロットに挿入
 ②キーボード、マウス、LANケーブル、HDMIケーブルをそれぞれ接続
 ③電源のUSBコネクタを挿して電源ONしてBoot up!
起動途中で、国別/言語、キーボード設定、パスワード変更等の作業がありますが、サクサクと進めます。もし不明点があればネット検索で多くの情報にヒットするので、そちらを参考にすれば難なく解決できると思います。
デフォルトユーザ"Pi"にて自動ログインでデスクトップ画面が立ち上がってきます。

【Tips】
Raspberry Piへ給電するUSBケーブルの件です。
手持ちのUSBケーブル(microUSB-USB)で、最初に写真の黒い方のケーブルを使っていたところ、Raspberry Piから低電圧状態のアラームが出ました。
・POWERLED(赤色)が点滅(消灯)する。
・デスクトップに低電圧状態のアラーム(雷マーク)が表示される。

リブートしてみても、起動途中に途中で落ちる?ようなことも起こり、動作が不安定でした。
初めは原因がよく分からなかったのですが、白い方のケーブルがあったのでそちらを試すと、今度はアラームも出ないで安定的に上がってきました。
RaspberryPi 電源ライン(microUSBケーブル).jpg
おそらくケーブルの太さの違いによる電力供給の差だろうと思います。
黒い方は見た目でも白い方より細いので、電圧降下が大きく給電が間に合わなかったと思います。
どんな場合でも『電源ラインは太く短く』が基本です。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

ArduinoでSDカード情報を取得する [Arduino]

(2021.1.1更新)
#とりあえず、上手くいかなかったことも後学のためと思い、掲載します。
#後日、解決したらタイトルも変えて、更新したいと思います。

(2021.1.9更新) Papilioシリーズ、中止しました
”Papilioでカメラ画像を転送する”シリーズをやっていますが、まぁまぁそんなにスムーズにいくわけもなく、いい感じで行き詰っております orz。。。
なかなか実績もないところもあり、Papilio or ZPUinoのどちらで間違えているか?切り分けもままならぬ状況なので、一旦、Arduinoで試してみようと思います。

ArduinoからSDカードへファイルを読み書きさせたいのですが、まず最初はタイトル通りにArduinoからSDカードの情報を取得してみたいと思います。

SDカードのIOは3.3Vで、Arduino UNOは5Vなのでそのままでは使えません。そのため今回はArduino Pro Mini(3.3V, 8MHz)を使います。

ArduinoとSDカードのやり取りはSPIというインターフェースで行われます。
SPIとは、。。。。。。。
ANALOGDEVICES社の技術資料ページのリンクを貼っておきます。
"https://www.analog.com/jp/analog-dialogue/articles/introduction-to-spi-interface.html#"

SDカードソケットを調達します。これ↓です。
SDカード配線引出基板
SDカード配線引出基板.jpg
"https://akizukidenshi.com/catalog/g/gK-10967/"
DIP化されるのでブレッドボードで使用可能になります。
USBコネクタは電源供給用です(基板上で5V→3.3Vに変換)。

【配線図】
ArduinoProMini(The Simple)ピン配置図.jpg
Arduino Pro Mini (pin) --- SDカード(基板)
  SCK(13)           CLK(CLK)
  MISO(12)          D0/DAT0(D0)
  MOSI(11)          DI/CMD(CMD)
  SS(10)           CS/CD/DAT3(D3)

Arduino Pro Mini_SDカード_ブレッドボード.jpg

【スケッチ】
最初にSDカード情報をコンソール画面に表示する、サンプルスケッチを試してみます。
Arduino IDEから
ファイル>スケッチ例>SD>CardInfo
スケッチのCS(SS)ピン番号を4→10に変更しています。
/*
  SD card test

  This example shows how use the utility libraries on which the'
  SD library is based in order to get info about your SD card.
  Very useful for testing a card when you're not sure whether its working or not.

  The circuit:
    SD card attached to SPI bus as follows: >次のようにSPIバスに接続されたSDカード
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila >Arduino Uno / Duemilanove / Diecimilaのピン11
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module. >SDカードのシールドまたはモジュールによって異なります。
 		Pin 4 used here for consistency with other Arduino examples
                >他のArduinoの例との一貫性のためにここで使用されるピン4


  created  28 Mar 2011
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
*/
/*******************************************************************************
テスト用SDカード情報取得プログラム
++++++ note ++++++
・Arduino Pro Mini用にSSピンを変更
・SDカード情報をコンソール画面に表示するプログラム

*******************************************************************************/
// include the SD library:
#include 
#include 

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
//const int chipSelect = 4;
//↓変更
// Arduino Pro Mini: pin 10
const int chipSelect = 10;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();

  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {
}

手元にあった512MBのSDカードを使って試してみましたが、動作がかなり不安定です。カード情報を取れたり、取れなかったり。
Arduino Pro Miniボードのリセットを何度か押して、コンソール画面に表示させます。
配線長とかも不安定の要素らしいので、出来るだけ短くした方が良いそうです。
SDカード情報①.jpg

とりあえずSDカードと認識しても”パーティションが無い!”とか不完全な感じです。
”Windows標準のフォーマットではなくてSDフォーマッターを使用してフォーマットした方が良い”とのネット記事も読んだので試してみましたが、状況は変わらないです。。。(FAT16 or FAT32でフォーマットしているんですけどね)
SDアソシエーション
"https://www.sdcard.org/jp/index.html"

その後、Arduino Pro Miniボードのリセットを連打しても、
 Initializing SD card...initialization failed. Things to check:
 * is a card inserted?
 * is your wiring correct?
 * did you change the chipSelect pin to match your shield or module?
のメッセージしか出ないですね。”配線を見直せ”と言われても4本しかないですからねー。

感覚的には20回に1回くらいでSDカードを認識するメッセージも出ますが、やっぱり"パーティションが無い"と言われて。。。
いずれにせよ、ちょっとこのままでは使い物にならないわけで、次の手を考えてみたいと思います。

=========================================================
(2021.1.1更新)
前回までの不安定動作が解消し、カード情報を取得することが出来たので更新します。

やったことは2つ、①電源強化と②パスコンの実装です。

①はこれまでもSDカードにアクセスした際に電圧降下も観測しなかったので”ちょっと違うかもしれない”とは思いつつ、電源周りを見直すことも一つの案として実施しました。

SDカード配線引出基板にはmicroUSB端子を利用して外部から5V電源を入力することが可能です。これまではArduino Pro Miniと同系統で3.3Vを供給していたため、電源ラインを分ける形にしました。
ただ結果的に、想定通りに問題解決策にはなりませんでした。
SDカード配線引出基板①.jpg
基板にmicroUSB端子を追加実装しています。

②パスコンの実装
電源とGNDの間に0.1μFのパスコンを実装しました(いわゆる、お守り代わりですが)。
実は前回もやって上手くいかなかったのですが、今回はブレッドボードに挿す感触が前回より強め?のような気がして。。。
結果、電源ラインもmicroUSB端子からこれまでと同様にArduino Pro Miniと同系統で3.3Vを供給しても安定動作して、パスコンが問題解決策になりました。
SDカード配線引出基板②.JPG

Arduino Pro Miniボードのリセットを押して、コンソール画面に表示させます。
Arduino Pro Mini_SDカード情報取得.jpg



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Arduinoで距離を測る(2)【赤外線測距センサ with XBee(動作確認)】 [Arduino]

せっかくなので、超音波測距センサのときと同じように、測定したアナログ値をバイナリデータとしてXBee間でシリアル通信して、PCのシリアルモニタに表示をさせます。

赤外線測距センサの「GP2Y0A21YK」の測定レンジは10cm~80cmですので、測定レンジを外れたら"Out of Range"と表示します。

【スケッチ】
<送信側>
/*******************************************************************************
赤外線距離センサ(GP2Y0A21YK)用XBeeトランスミッタ

++++++ note ++++++
シャープ測距モジュール(GP2Y0A21YK)用にArduinoProMini-XBee送信機

*******************************************************************************/
// These constants won't change. They're used to give names to the pins used:
const int analogInPin = A0;               //A0をアナログ入力ピンに指定
int sensorValue = 0;

// the setup routine runs once when you press reset:初期化(電源投入/リセット時1回のみ実行)
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);                     //9600bpsでシリアルポートを開く
}

// the loop routine runs over and over again forever: main loop
void loop() {
  sensorValue = analogRead(analogInPin);  //アナログ入力ピン(A0)の値を読む
  sendIntData(sensorValue);
  delay(100);
}

 // int型のデータを送信する関数
void sendIntData(int value) {
  Serial.write('H'); // ヘッダの送信
  Serial.write(lowByte(value));   // 下位バイトの送信
  Serial.write(highByte(value));  // 上位バイトの送信
}

<受信側>
/*******************************************************************************
赤外線距離センサ(GP2Y0A21YK)用XBeeレシーバ

++++++ note ++++++
シャープ測距モジュール(GP2Y0A21YK)用にArduinoUNO-XBee受信機

*******************************************************************************/
int recv_data;                                    //受信データ
const float Vcc = 5.0;                            //電源電圧(定数)
float range_volt;                                 //出力電圧
float range_data;                                 //距離

// 初期化(電源投入/リセット時1回のみ実行):
void setup() {
  Serial.begin(9600);                             //9600bpsでシリアルポートを開く
}
// main loop:
void loop() {
  // 受信バッファに3バイト(ヘッダ+int)以上のデータが着ているか確認
  if ( Serial.available() >= sizeof('H') + sizeof(int) ) {
    // ヘッダの確認
    if ( Serial.read() == 'H' ){
      int low = Serial.read();                    //下位バイトの読み取り
      int high = Serial.read();                   //上位バイトの読み取り
      recv_data = makeWord(high,low);             //上位バイトと下位バイトを合体させてint型データを復元
    }

  // 受信データから表示させる距離データを作成   
  range_volt = Vcc * recv_data / 1023;            //アナログピンから読み取った値を元の出力電圧値に戻す

  // 出力電圧から距離データを作成
//range_data = 27.289 * pow(range_volt, -1.202);  //【データシート】距離を計算(累乗近似) pow:べき乗
  range_data = 26.123 * pow(range_volt, -1.106);  //【実測】距離を計算(累乗近似) pow:べき乗

  // 距離データの表示 range_dataの値をハード・シリアルへ出力する(Arduino→PCモニタ)
    if((range_data >= 10) && (range_data <= 80)){   //range_dataが10以上80以下ならば、距離を表示する
      Serial.print("Range= ");
      Serial.print(range_data);                     //距離を表示
      Serial.println("[cm]");                       //単位はcm
    }
    else{                                           //range_dataがそれ以外ならば、Out of Rangeと表示する
      Serial.println("Out of Range");
    }
  }
}

赤外線測距センサ with XBee.JPG



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

Arduinoで距離を測る(2)【赤外線測距センサ】 [Arduino]

Arduinoで距離を測る(1)で超音波測距センサを使ってみました。XBee経由で遠隔からデータを取得することもできました。
次は、赤外線距離センサの「GP2Y0A21YK0F」を使います。
とりあえず、赤外線の距離センサと言ったらコレ!、というくらいネットでもヒットしますので定番なんでしょうね。これです↓
シャープ測距モジュール GP2Y0A21YK0F
GP2Y0A21YK.JPG
"http://akizukidenshi.com/catalog/g/gI-02551/"

今回は単純に動作させてみるだけなので、Arduino UNOに接続してPCのシリアルモニタで表示できるようにしたいと思います。

【配線図】
赤外線測距センサ_ブレッドボード.jpg
【スケッチ】
Arduino IDEから
ファイル>スケッチ例>01.Basics>AnalogReadSerial
のサンプルプログラムを改修して作成しました。

/*
  AnalogReadSerial

  Reads an analog input on pin 0, prints the result to the Serial Monitor.
  Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu).
  Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

  This example code is in the public domain.

  http://www.arduino.cc/en/Tutorial/AnalogReadSerial
*/
/*******************************************************************************
赤外線距離センサ(GP2Y0A21YK) サンプルプログラム

++++++ note ++++++
・シャープ測距モジュール GP2Y0A21YK
・測定した距離をコンソール画面に表示するプログラム
・測距範囲:10~80cm

*******************************************************************************/
const float Vcc = 5.0;                            //電源電圧(定数)
float range_volt;                                 //出力電圧
float range_data;                                 //距離

// the setup routine runs once when you press reset:初期化(電源投入/リセット時1回のみ実行)
void setup() {
  // initialize serial communication at 9600 bits per second:
  Serial.begin(9600);                             //9600bpsでシリアルポートを開く
}

// the loop routine runs over and over again forever: main loop
void loop() {
  int sensorValue = analogRead(A0);               //read the input on analog pin 0:
  range_volt = Vcc * sensorValue / 1023;          //アナログピンから読み取った値を元の出力電圧値に戻す

// 出力電圧から距離データを作成
//range_data = 27.289 * pow(range_volt, -1.202);  //【データシート】距離を計算(累乗近似) pow:べき乗
  range_data = 26.123 * pow(range_volt, -1.106);  //【実測】距離を計算(累乗近似) pow:べき乗

// 距離データの表示 range_dataの値をハード・シリアルへ出力する(Arduino→PCモニタ)
  Serial.print("Output Voltage= ");
  Serial.print(range_volt);                       //出力電圧を表示
  Serial.print("[V], ");
  Serial.print("Range= ");
  Serial.print(range_data);                       //距離を表示
  Serial.println("[cm]");                         //単位はcm
  delay(500);                                     //シリアルポートを溢れさせないように ※delay():単位ms
}

センサから出力されたアナログ値から距離を求める数式ですが、データシートのグラフと実測値を用いて、Excelにて累乗近似式で求めました。
GP2Y0A21YK0F 出力電圧-距離換算.jpg

距離が離れれば離れるほど計測結果はだいぶ怪しくなってきます。理由は距離に対する出力電圧の変化が小さいためだと思います。実用的には50cm未満のところで使うのが良いと思います。測定中の数値のバラつきもかなりありますので、距離を正確に計測するという用途よりも”ざっくりと20cm以下になったらブレーキをかけたい”とか、だいたいの近い距離まで接近したら何か処理をさせる、というような使い方が良いと思います。
#超音波測距センサとしてメジャーであれば、これから使う機会もあるのでしょうけど、個人的にはちょっと使いづらいデバイスだなー、とは思っています。。。



profile_picture_40×40.JPG
nice!(0)  コメント(0) 

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。