Category Archives: Arduino UNO

Arduino UNO (7) L298N

Arduino UNO でCarのモーターを動かす。

接続方法

Library追加

L298N Dual H-Bridge library for controlling via PWN 2 motors

https://github.com/yohendry/arduino_L298N

テストプログラム

#include <L298N.h>
const int ENA = 6;
const int IN1 = 9;
const int IN2 = 7;
const int IN3 = 2;
const int IN4 = 4;
const int ENB = 3;
L298N driver(ENA,IN1,IN2,IN3,IN4,ENB); 
int time_delay = 500;
int speed = 150;
void setup()
{
}

void loop()
{
  driver.forward(speed,time_delay);
  driver.full_stop(time_delay);
  driver.turn_right(speed,time_delay);
  driver.full_stop(time_delay);
  driver.turn_left(speed,time_delay);
  driver.full_stop(time_delay);
  driver.backward(speed,time_delay);
}

動く様子

 

 

Arduino UNO (6) i2c scanner

i2c のアドレスを確かめるため、下記のプログラムを動かせばいい。

// --------------------------------------
// i2c_scanner
//
// Version 1
//    This program (or code that looks like it)
//    can be found in many places.
//    For example on the Arduino.cc forum.
//    The original author is not know.
// Version 2, Juni 2012, Using Arduino 1.0.1
//     Adapted to be as simple as possible by Arduino.cc user Krodal
// Version 3, Feb 26  2013
//    V3 by louarnold
// Version 4, March 3, 2013, Using Arduino 1.0.3
//    by Arduino.cc user Krodal.
//    Changes by louarnold removed.
//    Scanning addresses changed from 0...127 to 1...119,
//    according to the i2c scanner by Nick Gammon
//    http://www.gammon.com.au/forum/?id=10896
// Version 5, March 28, 2013
//    As version 4, but address scans now to 127.
//    A sensor seems to use address 120.
// Version 6, November 27, 2015.
//    Added waiting for the Leonardo serial communication.
//
//
// This sketch tests the standard 7-bit addresses
// Devices with higher bit address might not be seen properly.
//
 
#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

結果は、シリアルモニターで繰り返し表示する。

Scanning...
I2C device found at address 0x27  !
done

Scanning...
I2C device found at address 0x27  !
done

Scanning...
I2C device found at address 0x27  !
done

 

Arduino UNO (5) BLE + 1602 LCD

BLE受信したデータは、1602 LCD表示するようにプログラムを改造。

受信があると、LCDに起動時間と受信文字が表示される。

ただ、複数の文字を送ると、最後の文字しか残らない。

#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

SoftwareSerial mySerial(7, 8); // RX, TX  
// Connect HM10      Arduino Uno
//     Pin 1/TXD          Pin 7
//     Pin 2/RXD          Pin 8

void setup() {  
  lcd.init(); 
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("BLE Test:");

  Serial.begin(9600);
  // If the baudrate of the HM-10 module has been updated,
  // you may need to change 9600 by another value
  // Once you have found the correct baudrate,
  // you can update it using AT+BAUDx command 
  // e.g. AT+BAUD0 for 9600 bauds
  mySerial.begin(9600);
}

void loop() {  
  char c;
  if (Serial.available()) {
    c = Serial.read();
    mySerial.print(c);
  }
  if (mySerial.available()) {
    c = mySerial.read();
    // set the cursor to column 0, line 1
    // (note: line 1 is the second row, since counting begins with 0):
    lcd.setCursor(0, 1);
    // print the number of seconds since reset:
    lcd.print('[' + String(millis() / 1000) + ']' + String(c));
    // lcd.print(c);
  }
}

 

Arduino UNO (4) BLE

いよいよBLEの実験を開始。Bluetooth 4.0 モジュールを使って、Android AppとArduinoを通信する。

まず持っているBluetooth 4.0 モジュールは、HM10 互換というから、参考になるものを探す。

なぜか、接続表のように、RX0/TX0からBluetoothモジュールとUNOボードを接続すると、プログラムを書き込みできない。

一旦切り離して、プログラムを書き込みおわったら、また接続すればうまくいく。

#もしかしてこれは常識???

Bluetooth 4.0 Arduino UNO R3ボード
VCC 5V
GND GND
TXD RX0(pin0)
RXD TX0(pin1)

そのため接続表のように、D7/D8からBluetoothモジュールとUNOボードを接続する。

Bluetooth 4.0 Arduino UNOボード
VCC 5V
GND GND
TXD pin 7
RXD pin 8

プログラム:

#include <SoftwareSerial.h>
SoftwareSerial mySerial(7, 8); // RX, TX  
// Connect HM10      Arduino Uno
//     Pin 1/TXD          Pin 7
//     Pin 2/RXD          Pin 8

void setup() {  
  Serial.begin(9600);
  // If the baudrate of the HM-10 module has been updated,
  // you may need to change 9600 by another value
  // Once you have found the correct baudrate,
  // you can update it using AT+BAUDx command 
  // e.g. AT+BAUD0 for 9600 bauds
  mySerial.begin(9600);
}

void loop() {  
  char c;
  if (Serial.available()) {
    c = Serial.read();
    mySerial.print(c);
  }
  if (mySerial.available()) {
    c = mySerial.read();
    Serial.println(c);    
  }
}

Android Appは、BleSerialPortというソフトウエアをインストールして試す。

Android Appから送信したデータは、シリアルモニタで表示される。

スクリーンショット 2017-09-07 15.38.35

次の実験は、受信データを1602LCDで表示する。

参考:

  • http://osoyoo.com/ja/2016/10/27/bluetooth-4-0-hm-10-android-arduino/

Arduino UNO (3) 1602 LCD i2c 表示

1602 LCD直接繋ぐと、6つのデジタルポートを占有(4つデータワイヤ+2の制御ワイヤが必要)し、GPIOはたくさん消耗するので、i2cを利用すると2つのアナログポートが足りる。

WeMosで試すと、うまくいかないので、より汎用のこのNANOで試す。すんなりうまくいく。行きよいでUnoにも試す。これを成功することて、次に、BLT通信を実験するさい、受信文字をモニタリングできる。

I2C インターフェイス SDA、SCL は Arduino Uno ではそれぞれ A4、A5 です。

Arduino Uno R3
SDA A4
SCL A5

 

サンプルプログラム。

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);

void setup() {
  lcd.init(); 
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("Hello, world!");
}

void loop(){
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  lcd.print(millis() / 1000);
}

写真も後ほどに。

Arduino UNO (2) TM1637 7段4桁LED

Arduino UNO (1) 7段4桁LED を表示してみる

参考のURLの通り、試しただけ。

TM1637 用ライブラリをインストール

  1. ライブラリをダウンロード
    http://www.seeedstudio.com/wiki/File:DigitalTube.zip
  2. ライブラリを Arduino IDE にインストール
    Arduino IDE の [スケッチ] → [ライブラリを使用] → [ライブラリをインストール…] からダウンロードしたライブラリ ZIP (DigitalTube.zip) を選択しインストールする。

    • \ドキュメント\Arduino\libraries\ 以下にコピーされる

繋がる

ピンアサインは、下表です。

Arduino Sensor Color
GND GND Black
VCC VCC Red
D8 DIO White
D7 CLK Yellow

スケッチを作成する

#include "TM1637.h"

#define NANA_SEG_CLK 7
#define NANA_SEG_DIO 8

TM1637 tm1637( NANA_SEG_CLK, NANA_SEG_DIO );

void setup() {
  tm1637.init();
  tm1637.set( BRIGHT_DARKEST );
}

void loop() {
  int8_t NumTab[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
  int8_t ListDisp[4];
  unsigned char count = 0;
  delay( 150 );
  while( 1 ) {
    count ++;
    if( count == sizeof(NumTab) ) count = 0;
    for( unsigned char BitSelect = 0; BitSelect < 4; BitSelect ++ ) ListDisp[BitSelect] = NumTab[count];
    tm1637.display( ListDisp );
    delay( 850 );
  }
}

 

動作を確認する

  1. Arduino IDE にてコンパイル&書き込み
  2. 7 セグの表示が 0 → 9 とカウントアップし、0 から再カウントアップすることを確認する

参考:

http://qiita.com/warafuuji/items/51b04c6ccfac92803fd3

Arduino UNO (1) Lちか

接続図

ArduinoのGNDとD13の間に赤色LEDとカーボン抵抗330Ωを接続しましょう。

Arduino IDEのインストール

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

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

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

CH340のドライバー

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

以下江苏沁恒股份有限公司のHPから
CH341SER.ZIP をダウンロードして解凍し、ファイルが展開されるので setup.exe を実行。

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

Blink

動作確認のため、まずLちか(Blink)をする。

プログラムを実行してみましょう。接続した赤色LEDが1秒間隔で点滅したら成功です。

// led_blink_sample1

const int led_pin = 13;           // LED connected to digital pin 13

void setup() {
  pinMode( led_pin, OUTPUT );     // sets the digital pin as output
}

void loop() {
  digitalWrite( led_pin, HIGH );  // sets the LED on
  delay( 1000 );                  // waits for a second
  digitalWrite( led_pin, LOW );   // sets the LED off
  delay( 1000 );                  // waits for a second
}