Делаю интерактивную игрушку. Говорящую, с акселерометром и светодиодами на Arduino PRO mini. Питание будет от аккумулятора. Пока схема питалась от USB - все шло гладко пока я в разрыв питания DFplayer mini не поставил ключ на двух транзисторах с P-канальным mosfet ибо 25 мА в спящем режиме это многовато и функция sleep(); из библиотеки плеера ничего не меняет. Ключ управляется с 13-ого пина. Со стороны плеера прут какие то пульсации до 1.5V (подобные пульсации заметил на линии Tx плеера), в динамике щелчки, ардуине не спится и все ломается, хотя на столе (отдельно) ключи работают отлично. Собрал два - один с 2N7002 по входу, другой с BCR515, силовой SI2309 в обоих, резисторы подобрал для надежного открывания-закрывания.
Коллеги!!! У меня кончились идеи. Вот код:
#include <Wire.h> // Wire library - used for I2C communication
#include "LowPower.h"
#include <SoftwareSerial.h> // Подключаем библиотеку SoftwareSerial
#include <DFPlayerMini_Fast.h> // Подключаем библиотеку DFPlayerMini_Fast
SoftwareSerial mySerial(7, 4); // Указываем к какими портам подключен DFPlayer
DFPlayerMini_Fast myMP3; // Создаем объект
const int wakeUpPin = 2;
int ADXL345 = 0x53; // The ADXL345 sensor I2C address
int X_out, Y_out, Z_out; // Outputs
int led_pins[6] = {3,5,6,9,10,11};
int hello[3] = {3,4,5};
float smoothness_pts = 800;//larger=slower change in brightness
int ii = 0;
int jj = 0;
int hh = 0;
int h_leds;
int time_del = 6000;
float gamma = 0.15; // affects the width of peak (more or less darkness)
float beta = 0.5; // shifts the gaussian to be symmetric
float pwm_val;
uint32_t tmr1, tmr2, tmr3, tmr4;
void wakeUp() {
ii = 0;
jj = 0;
pwm_val = 0;
if (digitalRead(2) == HIGH) {
digitalWrite(13, HIGH);
}
}
void setup() {
pinMode(12, INPUT);
pinMode(wakeUpPin, INPUT_PULLUP);
Serial.begin(9600); // Initiate serial communication for printing the results on the Serial monitor
Wire.begin(); // Initiate the Wire library
// Set ADXL345 in measuring mode
Wire.beginTransmission(ADXL345); // Start communicating with the device
Wire.write(0x2D); // Access/ talk to POWER_CTL Register - 0x2D
// Enable measurement
Wire.write(8); // (8dec -> 0000 1000 binary) Bit D3 High for measuring enable
Wire.endTransmission();
// Configure the ADXL345 to trigger an interrupt on the INT1 pin when new data is available
Wire.beginTransmission(ADXL345);
Wire.write(0x2C); // BW_RATE register
Wire.write(0x09); // 50 Hz output data rate
Wire.endTransmission();
Wire.beginTransmission(ADXL345);
Wire.write(0x31); // ENABLE sensivity register (0x24)
Wire.write(0x03); // sensivity 8g
Wire.endTransmission();
Wire.beginTransmission(ADXL345);
Wire.write(0x24); // ENABLE active acceleration register (0x24)
Wire.write(0x0F); // 0xXX*62.5
Wire.endTransmission();
Wire.beginTransmission(ADXL345);
Wire.write(0x27); // ENABLE activity for axes XYZ register (0x27)
Wire.write(0xF0); // Enable activity XYZ
Wire.endTransmission();
Wire.beginTransmission(ADXL345);
Wire.write(0x2E); // Access the INT_ENABLE register (0x2E)
Wire.write(0x10); // Enable activity interrupt (bit 4)
Wire.endTransmission();
Wire.beginTransmission(ADXL345);
Wire.write(0x2F); // Access the INT_MAP register (0x2F)
Wire.write(0x00); // Map data-ready interrupt to INT1 pin (bit 0)
Wire.endTransmission();
delay(20);
mySerial.begin(9600); // Открываем последовательную связь
myMP3.begin(mySerial); // инициализация
myMP3.volume(27); // Указываем громкость (0-30)
for (jj = 0; jj<sizeof(led_pins)/sizeof(int);jj++){
pinMode(led_pins[jj],OUTPUT);
}
tmr1 = millis();
tmr2 = micros();
tmr3 = millis();
tmr4 = millis();
}
void loop() {
attachInterrupt(0, wakeUp, HIGH);
if (millis() - tmr3 >= 30000) {
tmr3 = millis();
//digitalWrite(13, LOW);
myMP3.play(2);
h_leds = 0;
for (jj=0; jj<sizeof(led_pins)/sizeof(int); jj++){
analogWrite(led_pins[jj], h_leds);
}
delay(2000);
digitalWrite(13, LOW);
tmr4 = millis();
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
}
detachInterrupt(0);
if (millis() - tmr4 == 100) {
myMP3.play(1);
delay(2000);
//if(digitalRead(12) == HIGH) {
myMP3.play(hello[random(4)]);
// }
}
if (millis() - tmr1 >= 200) {
tmr1 = millis();
//==reset flag==//
Wire.beginTransmission(ADXL345);
Wire.write(0x30); // Start with register 0x30 (INT_SOURCE)
Wire.endTransmission(false);
Wire.requestFrom(ADXL345, 1);
Wire.read();
// === Read acceleromter data === //
Wire.beginTransmission(ADXL345);
Wire.write(0x32); // Start with register 0x32 (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(ADXL345, 6, true); // Read 6 registers total, each axis value is stored in 2 registers
X_out = ( Wire.read()| Wire.read() << 8); // X-axis value
//X_out = X_out/256; //For a range of +-2g, we need to divide the raw values by 256, according to the datasheet
Y_out = ( Wire.read()| Wire.read() << 8); // Y-axis value
//Y_out = Y_out/256;
Z_out = ( Wire.read()| Wire.read() << 8); // Z-axis value
//Z_out = Z_out/256;
Serial.print("X= ");
Serial.print(X_out);
Serial.print(" Y= ");
Serial.print(Y_out);
Serial.print(" Z= ");
Serial.println(Z_out);
Serial.println(digitalRead(12));
}
if (digitalRead(2) == HIGH) {
tmr3 = millis();
time_del = 20;
}
else{time_del = 6000;}
if (micros() - tmr2 >= time_del && ii<smoothness_pts) {
tmr2 = micros();
pwm_val = 255.0*(exp(-(pow(((ii/smoothness_pts)-beta)/gamma,2.0))/2.0));
for (jj=0; jj<sizeof(led_pins)/sizeof(int); jj++){
analogWrite(led_pins[jj], h_leds = pwm_val);
}
ii++;
}
if (ii >= smoothness_pts) {ii=0;}
}


