5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ArduinoをLipo電池で動かしてセンサーの値でLチカする【GingerBread】

Last updated at Posted at 2018-08-15

Arduinoを使っていると、Lipo電池をつないで独立して動かしたくなることがあります。
そんなときのために、Lipo電池を直接つなげて充電もできるArduino互換マイコン「GingerBread」を作りましたので紹介していきます。
今回は加速度センサーの値によってLEDが点灯するデモを作ってみたいと思います。

GingerBreadとは

photo01.jpg

Lipo電池は小型で充電もでき非常に便利ですが、充電するためには充電IC(例えばこちら)をマイコンとは別に買わなければいけませんし、配線も面倒です。
GingerBreadはこの充電ICの機能をマイコン自体に搭載しているため、直接Lipo電池をつないで駆動させたり、充電をすることができます。開発環境は通常のArduinoと同じで、価格も大幅に抑えています。

https://ginger-you.com/bread/

今回作るもの

アセット 2@72x.png

今回は加速度センサーを使って、振るとLEDが光るシンプルなデモを作ってみます。
同じ要領で明るさ、温度、音など様々なセンサーに変えることができますので、幅広いプロジェクトに応用できるのではと思います。

マイクロUSBコネクタにケーブルをつなぐと、Lipo電池の充電を行うこともできます。充電中はGingerBread上のLEDが赤く点灯し、充電が終わると消えます。

必要なパーツは以下のとおりです。

アセット 4@72x.png

サンプルコードと書き込み設定

サンプルコードは以下のとおりです。

# include <Wire.h>

# define ADXL345 0x53  //SDO=GNDのとき
# define ADXL345_CONFIG      0x31
# define ADXL345_POWER       0x2D
# define ADXL345_RATE        0x2C
# define ADXL345_DATA        0x32

bool ADXL345_exist;

void setup(void) {
  Serial.begin(9600);
  Wire.begin(); 

  ADXL345_exist = ADXL345_init();
  
  pinMode(2, OUTPUT);
}
 
void loop(void) {

  float g[3];
  if(ADXL345_exist){
    getAccel13bit(g);

    Serial.print("x: ");
    Serial.print( g[0] );
    Serial.print(" y: ");
    Serial.print( g[1] );
    Serial.print(" z: ");
    Serial.print( g[2] );

    float g_avg = sqrt(g[0]*g[0] + g[1]*g[1] + g[2]*g[2]);
    Serial.print(" average: ");
    Serial.print( g_avg );
    Serial.println();

    if(g_avg > 1.5){
      digitalWrite(2, HIGH);
      delay(200);
    } else{
      digitalWrite(2, LOW);      
    }
  }
  else Serial.println("No Sensor(ADXL345)");
  
  delay(10);
}

bool ADXL345_init(){
  
  int res;
  
//ADXL345 測定モード
//  13bit(最大)分解能 ±2g :0x08
//  13bit(最大)分解能 ±4g :0x09
//  13bit(最大)分解能 ±8g :0x0A
//  13bit(最大)分解能 ±16g:0x0B
  Wire.beginTransmission(ADXL345);
  Wire.write(ADXL345_CONFIG);
  Wire.write(0x0B);
  res = Wire.endTransmission();

//ADXL345 パワーモード
//  測定          :0x08
//  スタンバイ     :0x00
  Wire.beginTransmission(ADXL345);
  Wire.write(ADXL345_POWER);
  Wire.write(0x08);
  res = Wire.endTransmission();

//ADXL345 測定レートモード
//  3200Hz        :0x0F    1600Hz        :0x0E
//   800Hz        :0x0D     400Hz        :0x0C
//   200Hz        :0x0B     100Hz        :0x0A
//    50Hz        :0x09      25Hz        :0x08
//  12.5Hz        :0x07    6.25Hz        :0x06
  Wire.beginTransmission(ADXL345);
  Wire.write(ADXL345_RATE);
  Wire.write(0x0A);
  res = Wire.endTransmission();

  if(res>0) return false;
  else return true;
}

void getAccel13bit(float g[3]){
  
  byte axis_buff[6]; 
  int i = 0;
  float a = 0.0;
  
  Wire.beginTransmission(ADXL345);
  Wire.write(ADXL345_DATA);
  Wire.endTransmission();
  Wire.requestFrom(ADXL345, 6);

  while(Wire.available()){ 
    axis_buff[i] = Wire.read();   
    i++;
  }
  Wire.endTransmission();

  int x = (((int)axis_buff[1]) << 8) | axis_buff[0];
  int y = (((int)axis_buff[3]) << 8) | axis_buff[2];
  int z = (((int)axis_buff[5]) << 8) | axis_buff[4];

//  if(ADXL345_CONFIGMODE==0x08) a = 4.0;   //±2g
//  if(ADXL345_CONFIGMODE==0x09) a = 8.0;   //±4g
//  if(ADXL345_CONFIGMODE==0x0A) a = 16.0;  //±8g
//  if(ADXL345_CONFIGMODE==0x0B) a = 32.0;  //±16g
  a = 32.0;
 
  g[0] = x * a / 8192.0;
  g[1] = y * a / 8192.0;
  g[2] = z * a / 8192.0;

  return;
}

プログラムの書き込み方法は、Arduino Pro Miniと全く同じです。
ただし、GingerBreadのクロックは、ATmega328pの内部クロックを使用しているため、書き込み時のプロセッサは必ず「ATmega328p ( 3.3V / 8MHz )」を選択してください。

06.png

おわりに

今回は手前味噌ながらGingerBreadというオリジナルのマイコンについて紹介させていただきました。
Arduino Pro Miniと充電ICを使用するよりもコンパクトで低価格、配線などの手間もありませんので、ハードウェアプロトタイピングの様々なプロジェクトで使っていただければと思います。
ご要望等あればコメントいただければ幸いです。それでは!

5
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?