« 2018年8月 | トップページ | 2019年9月 »

2019年8月

2019年8月30日 (金)

Arduinoで作ろう(28) 生のATmega328Pにブートローダを書き込んでみた

Aitendo

 贔屓にしているaitendoで,あちゃんでいいの (177円),極貧ブートローダ書き込み機 (195円),USB-シリアルコンバータ (399円),AVRマイコン ATmega328P-PU (1個230円)を買いました。
「あちゃんでいいの」というのは最小構成のArduino UNO互換機なんだけど,ヘンなネーミングですなあ。「あちゃん」って何?

 で,この「あちゃんでいいの」で使うため,生のATmega328PにArduinoのブートローダを書き込むのが今回の目標です。もちろん,ブートローダ書き込み済みのAtmega328Pも売ってますが,お高いので(1個300円),自分で書き込もうというわけです。

 Arduino UNOをAVRライタとして使い,ブレッドボード上に置いたターゲットのATmega328Pとジャンパ線でつないで書き込む方法もあるのですが,「極貧ブートローダ書き込み機」という,素晴らしいミニシールドがあるので,コレを利用することにします。

◆ まずはArduino UNOをAVRライタとして使うための準備

 Arduino UNOをパソコンにつなぎ,Arduino IDEを起動して,スケッチ例から「ArduinoISP」を開いてUNOにアップロードします。

Image

 これで,Arduino UNOがAVRライタになりました。

◆ ブートローダの書き込み

Gokuhin

 ターゲットとなる生のATmega328Pを「極貧ブートローダ書き込み機」に取りつけて,AVRライタとなったUNOに載っけます。

UNOをパソコンにつなぎ,Arduino IDEのメニュー「ツール」→「書込装置」→「Arduino as ISP」とします。

Image1_20190826192501

 で,「ツール」→「ブートローダを書き込む」としてやれば,ターゲットにブートローダが書き込まれます。
このブートローダ書込済のATmega328Pを取り外して,「あちゃんでいいの」に取りつければ最小構成Arduino UNOの完成です!

次回は「あちゃんでいいの」にスケッチをアップロードしてみます。

| | | コメント (0)

2019年8月28日 (水)

Arduinoで作ろう(27) OLED(有機EL)モジュールを使ってみる

Lm35dz_oled_2

ちょっと前にaitendoで買ったOLEDモジュールをI2Cで使ってみました。
現在は「取扱終了」になってますが,同じものがAmazonでも手に入るようです。
ライブラリは,ココでダウンロードできる u8glib ってのでいいみたい。
んで,スケッチ例「GraphicsTest」をArduino IDEで読み込んでみました。

//U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0|U8G_I2C_OPT_NO_ACK|U8G_I2C_OPT_FAST);

という行のコメント//を削除すればこのOLEDが使用可能になります。
精細なグラフィックが美しいですが,そのままではつまんないので,LM35DZで測定した温度をちょいちょい表示するようにしたのがコレです→20190828graphicstest.ino

温度表示だけでよければ,

//aitendo OLED(0.96/128x64 青色/I2C) [M096P4BL]

#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST);

float analogdata, temp;

void setup(void) {
  u8g.setColorIndex(1);         // pixel on
}

void loop(void) {
analogdata = analogRead(A0);
temp = ((5.0 * analogdata) / 1024) * 100;
  u8g.firstPage();
  do {
    u8g.setFont(u8g_font_unifont);
    u8g.drawStr(0,22,"Temp:");
    u8g.setPrintPos(40, 22);
    u8g.print(temp);
    u8g.drawStr(86,22,"C");
   
    u8g.drawStr(0,44,"Time:");
    u8g.setPrintPos(40, 44);
    u8g.print(millis() / 1000);
    u8g.drawStr(70,44,"sec");
  } while ( u8g.nextPage() );
}

とか書いてやればOKです。グラフィックを使ったオリジナルの作例は,ヒマなときに取り組んでみたいと思います。(いつのことになるやら・・・)

| | | コメント (0)

2019年8月26日 (月)

Arduinoで作ろう(26) 気温・湿度・気圧のデータロガー (その2)

Sdcardshieldrtc_3 

 前回のデータロガーに以前使ったRTCモジュールを追加しました。
これで時刻をちゃんと取得できるので,もうExcelで ごにょごにょ しなくて済みます。

スケッチはコレ→ 20190825sd_write2.ino

/*
  SD card datalogger RTCモジュール付き
 */

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include <RtcDS3231.h>
#include "SparkFunBME280.h"
RtcDS3231<TwoWire>
Rtc(Wire);
BME280 sensor;
const int chipSelect = 4;

void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    while (1);
   }
  Serial.println("card initialized.");
  Wire.begin();
  sensor.beginI2C();
  Rtc.Begin() ;
}

void loop() {
   String dataString = "";
    char buff[12] ;
    RtcDateTime dt = Rtc.GetDateTime() ;
    sprintf(buff, " %02u:%02u:%02u", dt.Hour(), dt.Minute(), dt.Second()) ;
    dataString += String(buff);
    dataString += ",";
    dataString += String(sensor.readTempC());
    dataString += ",";
    dataString += String(sensor.readFloatHumidity());
    dataString += ",";
    dataString += String(sensor.readFloatPressure()/100.0);
 
   File dataFile = SD.open("datalog.csv", FILE_WRITE);
    if (dataFile) {
     dataFile.println(dataString);
     dataFile.close();
     Serial.println(dataString);
    }
  delay(600000); //10分(600000ms)ごとに測定
}

24時間測定した結果がこちら↓ 時刻もちゃんと記録できています。
Image1

| | | コメント (0)

2019年8月24日 (土)

Arduinoで作ろう(25) 気温・湿度・気圧のデータロガー

Sdcardshield_3

 Arduinoで作ろう(23) でBME280を使って気温・湿度・気圧を測定しましたが,この取得データをSDカードに記録してみました。いわゆるデータロガーですな。
 使ったのは,Seeed Studio製のSDカードシールド。これを使えばCR類の配線をしなくていいからラクチンです。

8578d9e3f67546688955ea77bd4f41a0

 Arduino IDEのスケッチ例「Datalogger」をちょっと書き換えただけですが,スケッチはコレ→20190823sd_write.ino

 このSDカードシールドのFritzingパーツを見つけられなかったので,RTC付きのSDカードシールドで配線図を描きました。でも,僕のシールドにはRTCが付いてないので,millis()でArduino起動後の経過時間を記録し,あとでExcel上で処理してやることにします。

/*
  SD card datalogger
 * 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)
 */

#include <SPI.h>
#include <SD.h>
#include <Wire.h>
#include "SparkFunBME280.h"
BME280 sensor;
const int chipSelect = 4;

void setup() {
  Serial.begin(9600);
  Serial.print("Initializing SD card...");
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    while (1);
   }
  Serial.println("card initialized.");
  Wire.begin();
  sensor.beginI2C();
}

void loop() {
   String dataString = "";
    dataString += String(millis()/1000);
    dataString += ",";
    dataString += String(sensor.readTempC());
    dataString += ",";
    dataString += String(sensor.readFloatHumidity());
    dataString += ",";
    dataString += String(sensor.readFloatPressure()/100.0);
 
   File dataFile = SD.open("datalog.csv", FILE_WRITE);
    if (dataFile) {
     dataFile.println(dataString);
     dataFile.close();
     Serial.println(dataString);
    }
  delay(600000); //10分(600秒)ごとに測定
}

 24時間測定して得られたcsvファイルをExcelで読み込みました。
B列を挿入してA列の値を hh:mm:ss の形式に変えます。

Excel

んで,グラフを作るとこんな感じ。

Graph

木造住宅2階の室内での測定です。深夜から明け方に気圧が下がり,雨が降って湿度が上がっています。

(その2) へ続く・・・

| | | コメント (0)

2019年8月22日 (木)

Arduinoで作ろう(24) 赤外線リモコンの信号解読

Ir-reciever_2

 Arduinoの中華製シールドを収集するのが趣味なのですが,少し前に買った KEYESTUDIO多機能シールドVer.1 を使って,TVリモコンの赤外線信号解読をやってみました。

800pxks0183_pinout

 いろいろなパーツが載ってますが,赤外線レシーバ(たぶんVS1838)とブザーを使います。

 I2CのLCDを接続できるピンも出てるので,コレをつないでみました。(リンク先の説明には,I2Cアドレスは0x27と書いてありますが,実際には0x3Fでした) このLCD用のライブラリはココでダウンロードできます。

/*
 * SHARPリモコンの信号を赤外線レシーバで受信
 */

#include <IRremote.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 16, 2); // I2Cアドレス 0x3F, 16x2
int RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
//Serial.begin(9600);
lcd.init();
lcd.backlight();
irrecv.enableIRIn();
pinMode(5,OUTPUT);
}

void loop() {
 if (irrecv.decode(&results)) {
  lcd.setCursor(0, 0);
  lcd.print("HEX:");
  lcd.print(results.value, HEX);lcd.print(" ");
  lcd.setCursor(0, 1);
    switch (results.value) {
    case 0x5324450A:lcd.print("button: 1");break;
    case 0xE072CF12:lcd.print("button: 2");break;
    case 0xCB96DB61:lcd.print("button: 3");break; 
    case 0x2F834551:lcd.print("button: 4");break;
    case 0x81041FF3:lcd.print("button: 5");break;
    case 0x9B14063:lcd.print("button: 6");break;
    case 0x1E5F84CF:lcd.print("button: 7");break;
    case 0xAB5F67EF:lcd.print("button: 8");break;
    case 0xF9792C4D:lcd.print("button: 9");break;
    case 0x82264CBD:lcd.print("button:10");break;
    case 0x2A0F2522:lcd.print("button:11");break;
    case 0x7E31B95A:lcd.print("button:12");break;
    default:lcd.print("button: ?");break; //1から12以外のボタンが押されたとき
    }
     for(int i=31;i>=0;i--){
     digitalWrite(5,bitRead(results.value,i));
     //Serial.print(bitRead(results.value,i));
     }
   //Serial.println("");
   irrecv.resume(); // Receive the next value
  }
 delay(200);
}

スケッチはこちら→ 20190821_irremote.ino

 SHARPのTVリモコンをIRレシーバに向けて操作すると,受信した信号を16進数で表示し,さらにswitch~caseで分けて,押されたボタンをLCDに表示するようにしてあります。他メーカーのリモコンなら,switch~caseの部分を書き換えればOKです。
 あと,bitRead(results.value,i)で32桁のバイナリデータを取り出して,これでブザーを鳴らしています。押したボタンによって音が異なります。

| |

2019年8月20日 (火)

Arduinoで作ろう(23) 複合気象センサ BME280で気温・湿度・気圧を測定

Bme280

 秋月電子で買った 複合気象センサ AE-BME280を使って,気温・湿度・気圧を測ってみました。

Aebme280

 AE-BME280はI2CでArduinoと通信するのですが,このセンサは3.3Vで動作します。でも,ArduinoのSDAとSCLは5Vの電圧でデータをやり取りするので,レベルコンバータを使ってI2Cの電圧を変換してやる必要があります。

 ネット上の情報を探ると,定格内ぎりぎりの電圧でArduinoと直接接続できそうなんだけど,ここは安全策を採ってaitendoのレベルコンバータLVCNV-I2Cを使うことにしました。LCDもaitendoのコレを使ってます。

BME280のライブリはココでダウンロードできます↓
https://github.com/sparkfun/SparkFun_BME280_Arduino_Library

スケッチはコレ→ 20190819bme280.ino

/*
 * 温度・湿度・気圧センサ
 * 秋月AE-BME280 I2C接続
 * aitendo I2Cレベルコンバータ LVCNV-I2C
 */

#include <Wire.h>
#include "SparkFunBME280.h"
#include <ST7032.h>
BME280 sensor;
ST7032 lcd;

void setup() {
  lcd.begin(16, 2);
  lcd.setContrast(30);
  Wire.begin();
  sensor.beginI2C();
}

void loop() {
  lcd.setCursor(0, 0);
  lcd.print(sensor.readTempC(), 1);lcd.write(0b11011111);lcd.print("C , ");
  lcd.print(sensor.readFloatHumidity(), 1);lcd.print("%");
  lcd.setCursor(0, 1);
  lcd.print(sensor.readFloatPressure() / 100.0, 1);lcd.print("hPa");
  delay(3000);
}

| | | コメント (0)

2019年8月18日 (日)

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

Magnetic_levitating  

https://www.tubefr.com/arduino.html

で紹介されている「空中浮遊」をやってみました。

手持ちのホールセンサは秋月のA1324LUA-Tってやつで,ピンポン玉くらいの重さのものしか持ち上げられませんが,これはなかなか愉快です。

20190818

電磁石は5mmの鉄製ボルトに0.4mmのエナメル線を巻いてつくります。

ホールセンサは写真の位置に両面テープで貼り付けました。

スケッチはこんなかんじ。

/* 空中浮揚 Arduino NANO
 ホールセンサ A1324LUA
 モータドライバ TA7291P */
void setup() {
     //Serial.begin(9600);
     pinMode(2,OUTPUT);
     pinMode(3,OUTPUT);
 }
 
void loop() {
    //Serial.println(analogRead(0));
    if (analogRead(0)>950){
    digitalWrite(2,HIGH);
    digitalWrite(3,LOW);
   }else {
    digitalWrite(2,LOW);
    digitalWrite(3,HIGH);
   }
 }

【追記】ホールセンサをUGN3503に取り換えて作り直したらパワーアップしました。Arduinoで作ろう(52) もご覧ください。

 

| | | コメント (0)

« 2018年8月 | トップページ | 2019年9月 »