Beetle微型控制器

1、简介

Beetle CM-32U4 是Beetle控制器的升级版本,也是Leonardo的极简版本,同时具备了Leonardo的类似的强大应用功能。我们在保留Beetle控制器丰富功能与小体积优点的前提下额外增加了充电管理功能,这样用户就能通过USB为电池包充电并在USB无法供电时使用电池包为项目供电,能大大提升”一次性”小巧项目的使用寿命。Beetle CM-32U4这块主板共有3种供电方式:1.USB供电;2.BAT引脚的电池包供电;3.VIN引脚的5V外部电源供电。小巧、可充电以及多样的供电方式使得该主板具有更广的适用性。

Beetle CM-32U4与Arduino环境兼容,版本类型选择“Arduino Leonardo”。


2、特点

  • 小巧尺寸,便于集成 (22mm x 20.5mm)

  • Leonardo的极简版本,具备和Leonardo类似的强大应用功能

  • 提供3种供电方式:

    • USB供电

    • 电池包供电(BAT端口只能接3.7V的锂电池)

    • 5V的VIN外部电源输入(VIN的输入电压范围是4.5V~6V)

  • 具有充电功能,能给3.7V的锂电池进行充电

  • 板载了3个不同颜色的功能指示灯:红色电源指示灯(PWR),蓝色普通LED灯(L),绿色充电指示灯


3、产品参数

产品尺寸图

尺寸图

  • 微控制器: ATmega32U4
  • Flash空间:32KB(4K已用于bootloader)
  • SRAM空间:2.5KB
  • 时钟频率:16MHz
  • EEPROM空间:1KB
  • 充电芯片:TP4056X
  • 工作电压:5V (DC)
  • 工作温度范围:-40℃~125℃
  • 涓流充电电流:130mA
  • 最大充电电流:600mA
  • I2C:1组(WIRE库)
  • SPI:1组(SPI库)
  • UART:1组
  • PWM:2组
  • 模拟端口:2组
  • 电源端口:3组
  • 产品尺寸:22 x 20.5mm

4、引脚及外观说明图

引脚图


板卡选择

软件下载Arduino IDE

1

5、指示灯状态说明

状态 电源指示灯(红色) LED灯(蓝色) 充电指示灯(绿色)
熄灭 主板无电 可自设 电池已充满
常亮 主板上电 可自设 充电中
闪烁 烧录程序/复位中 复位中/可自设 无电池
  • 蓝色LED灯也可以作为普通LED下载Blink.ino来进行使用,引脚号为13。

6、充电过程

准备一个容量为1000mAh的锂电池,正极接BAT端口,负极接GND端口。

充电现象


此时BAT端口会以200mA~600mA的输入电流对电池进行充电。

这时绿色充电灯会提示您电池的当前状态:

状态 充电指示灯(绿色)
熄灭 电池已充满
常亮 充电中
闪烁 无电池

7、复位现象

短接RST和GND端口

复位现象

注意:RST过程中只会影响到红色电源灯和蓝色指示灯

8、功能引脚使用

8.1 SPI

这里使用的是BMM150地磁检测传感器来演示SPI引脚功能的使用效果,可以看到主板通过SPI成功对传感器进行初始化设置。

SPI连线


#include "DFRobot_BMM150.h"

#if defined(ESP32) || defined(ESP8266)
  #define BMM150_CS D3
#elif defined(__AVR__) || defined(ARDUINO_SAM_ZERO)
  #define BMM150_CS 3
#elif (defined NRF5)
  #define BMM150_CS 2  //The corresponding silkscreen on the development board is the pin of P2
#endif
/*!
 * @brief Constructor 
 * @param cs Chip selection pinChip selection pin
 *        spi连接方法
 *        (SDO<-->MISO)    (SDI<-->MOSI)
 *        (SCK<-->SCK)     (PS<--> GND)
 *        (CS<-->CS 可自定义引脚)
 */
DFRobot_BMM150_SPI bmm150(/*cs = */BMM150_CS);

void setup() 
{
  Serial.begin(115200);
  while(!Serial);
  while(bmm150.begin()){
    Serial.println("bmm150 init failed, Please try again!");
    delay(1000);
  } Serial.println("bmm150 init success!");

  /**!
   * 传感器自测,返回的字符串表明自检结果
   * mode:
   *  BMM150_SELF_TEST_NORMAL              // 普通自测,测试X,Y,Z轴是否连接,是否短路
   *  BMM150_SELF_TEST_ADVANCED            // 高级自测,测试z轴数据的准确性
   */
  Serial.println(bmm150.selfTest(BMM150_SELF_TEST_NORMAL));

  /**!
   * 设置传感器的执行模式
   * opMode:
   *   BMM150_POWERMODE_NORMAL  // normal mode  正常的获得地磁数据的模式
   *   BMM150_POWERMODE_FORCED  // forced mode  单次测量,测量完成后,传感器恢复sleep mode
   *   BMM150_POWERMODE_SLEEP   // sleep mode   用户可以访问所有寄存器,不能测量地磁数据
   *   BMM150_POWERMODE_SUSPEND // suspend mode 此时传感器cpu不工作,无法执行任何操作,
   *                                            用户只能访问控制寄存器 BMM150_REG_POWER_CONTROL的内容
   */
  bmm150.setOperationMode(BMM150_POWERMODE_NORMAL);

  /**!
   * 设置预置模式,使用户更简单的配置传感器来获取地磁数据
   * presetMode:
   *   BMM150_PRESETMODE_LOWPOWER      // 低功率模式,获取少量的数据 取均值
   *   BMM150_PRESETMODE_REGULAR       // 普通模式,获取中量数据 取均值
   *   BMM150_PRESETMODE_ENHANCED      // 增强模式,获取大量数据 取均值
   *   BMM150_PRESETMODE_HIGHACCURACY  // 高精度模式,获取超大量数据 取均值
   */
  bmm150.setPresetMode(BMM150_PRESETMODE_HIGHACCURACY);

  /**!
   * 设置获取地磁数据的速率,速率越大获取越快(不加延时函数)
   * rate:
   *   BMM150_DATA_RATE_02HZ
   *   BMM150_DATA_RATE_06HZ
   *   BMM150_DATA_RATE_08HZ
   *   BMM150_DATA_RATE_10HZ   (default rate)
   *   BMM150_DATA_RATE_15HZ
   *   BMM150_DATA_RATE_20HZ
   *   BMM150_DATA_RATE_25HZ
   *   BMM150_DATA_RATE_30HZ
   */
  bmm150.setRate(BMM150_DATA_RATE_30HZ);

  /**!
   * 使能xyz轴的测量,默认设置为使能不需要配置,禁止后获取xyz轴的地磁数据不准确
   * 如果想配置更多参数请参考.h文件中的 setMeasurementXYZ() 函数
   */
  bmm150.setMeasurementXYZ();

  /**!
   * 获取配置的数据速率 单位:HZ
   */
  uint8_t rate = bmm150.getRate();
  Serial.print("rate is "); Serial.print(rate); Serial.println(" HZ");
  
  /**!
   * 获取 x y z 轴的使能状态,返回字符串为使能的状态
   */
  Serial.println(bmm150.getMeasurementStateXYZ());
  
  /**!
   * 获取传感器的执行模式,返回字符串为传感器的执行模式
   */
  Serial.println(bmm150.getOperationMode());
  
  /**!
   * 软件复位,软件复位后先恢复为挂起模式,而后恢复为睡眠模式,suspend mode下不能软件复位
   */
  bmm150.softReset();    // After software reset, resume sleep mode, (Suspended mode cannot be reset)
}

void loop() 
{
  /**!
   * 获取传感器的执行模式,返回字符串为传感器的执行模式
   */
  Serial.println(bmm150.getOperationMode());
  delay(1000);
}

SPI运行结果

8.2 I2C

这里使用的是SHT31温湿度传感器来演示I2C引脚功能,主板通过I2C通信打印出了环境温湿度。

I2C连线


#include <DFRobot_SHT3x.h>


//DFRobot_SHT3x sht3x(&Wire,/*address=*/0x45,/*RST=*/4);

DFRobot_SHT3x   sht3x;

void setup() {

  Serial.begin(9600);

  while (sht3x.begin() != 0) {

    Serial.println("Failed to Initialize the chip, please confirm the wire connection");

    delay(1000);

  }


  Serial.print("Chip serial number");

  Serial.println(sht3x.readSerialNumber());

   if(!sht3x.softReset()){

     Serial.println("Failed to Initialize the chip....");

   }


  //if(!sht3x.heaterEnable()){

    // Serial.println("Failed to turn on the heater....");

  //}

  Serial.println("------------------Read adta in single measurement mode-----------------------");

}



void loop() {



  Serial.print("Ambient Temperature(°C/F):");

  Serial.print(sht3x.getTemperatureC());

  Serial.print(" C/");

  Serial.print(sht3x.getTemperatureF());

  Serial.print(" F ");

  Serial.print("Relative Humidity(%RH):");

  Serial.print(sht3x.getHumidityRH());

  Serial.println(" %RH");


  delay(1000);

}

I2C结果

8.3 模拟口

这里使用了一个电位器通过模拟口输入模拟值控制接入数字口的LED灯的亮度并在串口打印出电位器的模拟值:

pwm和analog连线

int val;
int ledPin=9;
int anologPin=0;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  val=analogRead(anologPin);     
  analogWrite(ledPin,val/4);//analogRead values go from 0 to 1023,analogWrite values from 0 to 255
  Serial.println(val,DEC);
                   
}

串口打印出电位器的值,电位器的值越大LED灯越亮。

PWM串口输出

8.4 串口(RX/TX)

这里使用了一个NFC模块,通过串口读取NFC卡中的数据
NFC连线图


/*!
    @flie read_S50_uart.ino
    @Copyright   [DFRobot](http://www.dfrobot.com), 2016
    @Copyright   GNU Lesser General Public License
    @version  V1.0
    @date  07/03/2019

    @brief This demo runs on the Arduino MEGA2560 platform.
           Download this demo to learn how to read data on card and read data through serial ports.
           Read the data on the card to see if the write is successful.

    This demo and related libraries are for DFRobot Gravity: I2C&UART NFC Module
    Product(CH): http://www.dfrobot.com.cn/goods-762.html
    Product(EN): https://www.dfrobot.com/product-892.html
*/
#include <DFRobot_PN532.h>

#define BLOCK_SIZE 16
//Initialize MEGA2560
DFRobot_PN532_UART  nfc;
struct card NFCcard ;

void setup() {
  Serial.begin(115200);
  while (!nfc.begin(&Serial1)) {
    Serial.println("initial failure");
    delay (1000);
  }
  Serial.println("Waiting for a card......");
}

uint8_t dataWrite[BLOCK_SIZE] = {"DFRobot NFC"};   /*Write data page */
uint8_t dataRead[16] = {0};

void loop() {
  //Scan, write and read NFC card every 2s
  //Print all what is to be written and read

  if (nfc.scan() == true) {

    NFCcard = nfc.getInformation();
    if (NFCcard.AQTA[1] == 0x02 || NFCcard.AQTA[1] == 0x04) {
      Serial.print("Data to be written(string):");
      Serial.println((char *)dataWrite);
      Serial.print("Data to be written(HEX):");
      for (int i = 0; i < BLOCK_SIZE; i++) {
        Serial.print(dataWrite[i], HEX);
        Serial.print(" ");
      }
      Serial.println();
      //Write data(16 bytes) to sector 1
      if (nfc.writeData(2, dataWrite) != 1) {
        Serial.println("write failure!");
      }

      //Read sector 1 to verify the write results
      nfc.readData(dataRead, 2);
      Serial.print("Data read(string):");
      Serial.println((char *)dataRead);
      Serial.print("Data read(HEX):");
      for (int i = 0; i < BLOCK_SIZE; i++) {
        //data[i] =  dataRead[i];
        Serial.print(dataRead[i], HEX);
        Serial.print(" ");
      }
    }
    else {
      Serial.println("The card type is not mifareclassic...");
    }
  }
  else {
    //Serial.println("no card");
  }
  delay(2000);
}

通过串口打印出读取到的数据:
串口打印结果

更多问题及有趣的应用,可以访问论坛进行查阅或发帖!

Beetle有趣的应用:光剑

资料下载

更多

Beetle有趣的应用:

DFshopping_car1.png 购买Beetle 控制器 (SKU:DFR0816)