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

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

# GingerBreadとは
![photo01.jpg](https://qiita-image-store.s3.amazonaws.com/0/164437/d445c46a-672b-2bc2-422f-a1a76ea0cb95.jpeg)

Lipo電池は小型で充電もでき非常に便利ですが、充電するためには充電IC（[例えばこちら](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-064S)）をマイコンとは別に買わなければいけませんし、配線も面倒です。
GingerBreadはこの充電ICの機能をマイコン自体に搭載しているため、直接Lipo電池をつないで駆動させたり、充電をすることができます。開発環境は通常のArduinoと同じで、価格も大幅に抑えています。

[https://ginger-you.com/bread/](https://ginger-you.com/bread/)

#今回作るもの
![アセット 2@72x.png](https://qiita-image-store.s3.amazonaws.com/0/164437/e017e9fd-541b-617d-4323-a11fa775621b.png)

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

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

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

![アセット 4@72x.png](https://qiita-image-store.s3.amazonaws.com/0/164437/33cf96c9-a0f1-ffc9-bedc-9fc33de8861c.png)

- GingerBread（[https://ginger-you.com/bread/](https://ginger-you.com/bread/)）
- 加速度センサ（ADXL345）（[秋月電子](http://akizukidenshi.com/catalog/g/gM-06724/)）
- ピンヘッダ（[秋月電子](http://akizukidenshi.com/catalog/g/gC-00167/)）
- リチウムイオンポリマー電池（[スイッチサイエンス](https://www.switch-science.com/catalog/3166/)／[千石電商](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-53KN)）
- ３端子スライドスイッチ（[秋月電子](http://akizukidenshi.com/catalog/g/gP-08790/)）
- マイクロUSBコネクタDIP化キット（[秋月電子](http://akizukidenshi.com/catalog/g/gK-10972/)）
- LED（[秋月電子](http://akizukidenshi.com/catalog/g/gI-11657/)）
- USBシリアル変換アダプタ（3.3V版）（[千石電商](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-04FM)）
- USBケーブル（micro-bオス-Aオス）（[千石電商](https://www.sengoku.co.jp/mod/sgk_cart/detail.php?code=EEHD-4X7E#)）

#サンプルコードと書き込み設定
サンプルコードは以下のとおりです。

```c
#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](https://qiita-image-store.s3.amazonaws.com/0/164437/cf88c76e-f195-0d78-76e6-e413ec89e4a8.png)

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