刺猬-会说话的鸟[如果有MP3播放器]



很久以前,似乎已经不真实了, masterkit谈到了一个很棒的内置MP3播放器,它可以配备任何东西,甚至MP3播放器,如果您先从中取出自己的东西,然后再戴上它。简而言之,是一件有用的事情。尤其是如果您要制作儿童玩具,首先要用自己的双手,其次要正确,而不是像那些以工业规模制造玩具的人那样思考。

但是,在展示的产品中,我不仅对所有内容都感到满意,所以我想:这不可能使具有中国特色的东西不在Aliexpress上。确实,有一定数量的此类参与者,对模型范围的熟悉表明,存在比具有固定内存量的模型更具吸引力的选择。即-具有用于可移动microSD卡的插槽。

走开了。



为了弄清楚它的去向和去向,以各种方式进行了刺猬演示。

等待时有趣的短语:



通过卡片切换和切换故事,音量和摇动:



无线充电:



在继续讲故事之前,我很抱歉在描述和电路方面可能会出现一些错误,因为在此过程中我没有直觉地记录任何东西。请使用常识和实用材料,以免日后痛苦不堪。

因此,经过简短的搜索和比较之后,我转到了Ebay,在那里我得到了想要的东西- 带有JQ6500解码器芯片,4 MB内部存储器和microSD插槽播放器



为什么是这个玩家?因为在我看来,这是自制工作的理想选择。因为一切都在他身上。如果需要,请单独使用它:为此,有播放/暂停引脚,切换音轨,音量,五个音轨的快速播放以及用于将扬声器直接连接到板的单声道放大器(也有立体声输出,但已经需要一个外部放大器)。也就是说,至少要有足够的电池,扬声器,几个按钮和带有音乐的存储卡。

图片

但是更有趣的是,通过类似串口的方式来完全控制播放器。在这里,您可以做任何事情-播放,停止,更改音量,切换均衡器和播放模式,以“通过”顺序和从某些文件夹开始播放任意歌曲。而且,就我而言,重要的是,已经有一个现成的 Arduino

因此,已知两个组件:播放器和Arduino。但就我个人而言,我不想停在这里,因为愚蠢地模仿整个微控制器的按钮是愚蠢的。需要一些特殊的东西,以便可以说和Emely一起长矛。

因此,在这里我们添加了最简单的振动传感器SW-18010P和著名的RC522读卡器

图片

只是为了完全摆脱按钮,我发现在娱乐性玩具中这些按钮是不必要的。自己判断:如果有按钮,则孩子会以某种方式按一下按钮,并且按频率更高-偶然而不是有意识地。但是,童话故事的超频繁转换还是不太正确的。

图片

事实证明:振动传感器可在孩子拿起玩具时打开玩具。在儿童将其戴上足够长的时间之前,相同的传感器将不允许关闭玩具。至于Mifare读卡器,我认为这对于切换童话故事非常方便。例如,可以将卡贴在书上,然后孩子可以通过将玩具拿到书上来听童话故事。

卡片还可以贴在各个主题上,然后孩子将能够听取他们的描述和使用规则。例如,这个白色的小雕像是冰箱,我们将食物存放在那里,以免食物变质,因此,不值得打开它。或者这是烤箱,它可能很热,因此您无需挂在其把手上,也无需将手放在玻璃上。可以发明很多东西,特别是因为这些卡是地铁票(是的,我很幸运,我在莫斯科),可以轻松地以适当的数量收取这些票。

因此,在我思考的同时,我从库存中取出了ATmega328p控制器,将其焊接到面包板上,并通过Arduino Mega 2560刷新了Adruino引导程序。

图片

为方便起见,我将串行端口,重置和接地连接到单独的连接器以进行快速编程。然后我知道了自己-我将填写草图,然后一个不正确,另一个不正确。

近焊接又和稳定3.3V为RC522误吃正是这种张力,而其余的成分普遍5V,我预计将从采取茁壮成长朴实无华pauerbanka电池类型18650

图片

使用这样pauerbank代替的决定典型的扁平电池似乎违反直觉。但我认为,由于玩具会消耗相当大的电流(仅待机模式下的控制器和播放器会消耗约40 mA电流),因此能够用一块充满的电池快速更换空电池的功能非常有帮助。

而且我还必须添加一个压电陶瓷高音扬声器,以指示某些事件(例如读卡)。您说的这通常很有趣-有位发言人,对吗?好吧,不是。毕竟,扬声器已连接到播放器,而不是控制器。他还添加了一个晶体管作为按键,可以在睡眠期间关闭MP3播放器,以减少能耗。

细心的读者可能会注意到,播放器可以由数字控制器引脚供电,此引脚在打开和关闭时都表现出色。我自己想要,但仅在待机模式下播放器才会消耗16 mA电流。音乐播放时,轻松消耗100 mA以上的电流,这已经是ATmega容量的至少两倍。因此,我采用集电极电流为300 mA的“任何” npn晶体管,并通过一个约200欧姆的电阻将其带到控制器的数字引脚。

但是读卡器消耗的电流在40 mA以内,因此为它供电的稳定器可以连接到控制器的数字引脚。他这样做了,但还是没用,最后还是没用。

另一个这样的观点:玩家需要一个动态头,其电阻至少为8欧姆。我有一个(系统单元中的扬声器),但是她的声音不是很好。也有一个电阻为4欧姆的扬声器(来自典型的中国扬声器)。总的来说,我将两者串联:一个给出更高的电平,另一个给出低电平,它们在一起听起来很酷。

仍然是一件小事灵魂的镜子。这是最容易由串联连接的一对LED制成的。我没有采取残酷的红色-这非常可怕。但是眼睛是琥珀色的-就是这样。

因此,玩具的模型被组装和调试。现在最重要的是:您需要一个供体。其实我真的很想说话的鸟但是从邻近玩具的价格来看,这种乐趣并不完全是预算。特别是当您认为孩子的兴趣是不可预测的事情时。

因此,首先,我开始寻找负担得起的移植对象。其中一个被发现:在儿童世界出售的迷人的刺猬伊芙琳

图片

当然,我不得不几乎完全摆脱了刺猬的丰富内心世界。并用装在普通肥皂盒中的自制肥皂代替。但是,不是很普通。事实是,与许多肥皂盒不同的是,该肥皂盒的背面很平整,因此在其中放置读卡器很方便-您的距离很小。另一方面,肥皂盒带有按摩刷之类的东西,甚至有孔,即扬声器放置在理想​​的位置:声音会通过开口散发出来,而不会被按摩钉堵塞。但是,这些孔还不够,但这并不重要-我仍然在钻。



我必须承认,最困难的事情是刺猬的手术。首先,我不喜欢缝制。而且我必须得体:首先将它撕开,然后系紧边缘,然后缝制六个纽扣。然后他松开了六个纽扣,缝了四个纽扣。为何全部?因为起初我缝的是小错误的,所以刺猬被解开了。



其次,眼睛。当然,我谨慎地购买了直径为3 mm的LED,以便可以保证它们能够描绘瞳孔。但是,在刺猬伊芙琳的眼睛上钻洞并不是那么容易。似乎:您拿着一个雕刻机,在其中放上正确的钻头-然后继续。但是事实证明,在钻孔过程中,塑料变成了粘性物质,弱雕刻机的钻头被卡紧了。

而且,我必须说,刺猬从他的眼睛里伸出来的刺猬是一副地狱般的奇观。

顺便说一句,我什至不知道该如何建议。我以某种方式扭曲并仍然打孔,在其中插入LED并填充环氧树脂,并在顶部覆盖无色指甲油。眼睛也被环氧树脂粘在了刺猬身上,因为原始的坐骑在钻孔过程中死亡了。结果并不完美,但可以忍受。

您已经看到了刺猬的工作方式。因此,我只能复制其当前逻辑的文本。最初,刺猬处于睡眠模式。如果捡起它(或只是移动它,或移动它所在的表面等),它将被中断唤醒,并产生振动传感器。

之后,在预定的时间间隔内,刺猬会说出预定义的短语,如果您一段时间未触摸刺猬,他将再次入睡。而且,如果您触摸它,它也不会入睡。如果将其摇晃一会儿,它将开始讲述一个童话故事,是随机选择的。

如果您将卡片带到刺猬(当他不睡觉时),那么刺猬将开始讲述与此卡片相关的故事。没有固定的约束,替换童话时顺序会改变。仅固定了两个服务卡:用于调节音量和强行安抚刺猬。顺便说一下,音量是通过依次切换三个步骤(安静-中等-大声)来调节的。

至于琥珀色的眼睛,当刺猬醒来时它们眨眼两次(一个周期),但是当刺猬讲述童话故事时它们保持沉默并改变亮度。在我看来,这是最好的选择。

在组装过程中,我尝试了另一项创新:由于移动电源具有两个连接器(输入和输出),因此将现有的Qi无线充电适配器连接至输入。因此,事实证明,要给刺猬充电,根本不需要解开它-只需将其放在无线充电器上过夜即可。但是,仅此功能仍处于测试模式。

总的来说,尽管表面上看起来很简单,但仍有一些事情使我感到困惑。例如,从代码中,您可以注意到我连续几次向播放器发送一些命令,甚至在最后放置一个超时。所有这些都是因为实际上在我的配置中,这是唯一可行的方法。

还可以看到,由于某种原因,我是通过播放器的硬件信号控制播放结束的,而不是通过简单的命令仅打开一个文件的播放模式。这也不只是这样:出于某种原因,此模式对我不起作用,因此当一首歌曲结束时,播放器将开始播放下一首歌曲。

似乎更奇怪的是,用于播放随机乐曲的随机函数不断循环,而不是仅在确实需要时才调用。但这就是问题:如果仅在需要时才调用它,则由于某种原因,在大多数情况下,它会返回相同的值。但是,如果放入循环,则会生成真正的伪随机值。实际上,当我试图了解刺猬的不当行为时,我也在实践中发现了。

最后,令我完全困惑的是无法应对使用控制器的数字引脚关闭读卡器的工作,而读卡器由控制器的数字引脚供电。出于某种原因,事实证明,如果将引脚设置为LOW,然后设置为INPUT,则读取器不会关闭。

同时,如果您仅将LOW设置为低,则读卡器的LED完全“点亮”,为读卡器供电的稳定器输出端的电压约为1伏。如果然后在控制器引脚上进行INPUT,则该电压将上升到大约3V。

更有趣的是,如果您首先将连接到阅读器的SS和RST的控制器引脚设置为LOW和INPUT,然后将控制器的电源引脚切换到相同位置,则阅读器将关闭。而且即使电源引脚转移到OUTPUT和HIGH位置,睡眠后它也会打开。

但是,定时器会发生无法弥补的事情。也就是说,我认为是这样,因为经过这样的假想(关闭读者的睡眠)后,眼睛和摇动计数器无法正常工作,并且这两个过程都与millis()有关。我不知道发生了什么以及如何恢复计时器,因此我将其保持原状-读卡器即使在睡眠期间也可以继续吃饭。

如果资深同志们帮助我们找到一条出路,我将不胜感激。尽管我几乎不相信老同志会读到这个地方。

鉴于上述情况,Evelyn的刺猬代码完全不完善,但是您可以随时对其进行梳理(代码或刺猬-自行选择),优化,补充,减少或以其他方式适应您的需求。这就是为什么我要附加它。为了更容易使用,设置的最大值(我尝试了所有方法,但照常进行)不是在代码中,而是在变量定义部分。有一个引脚配置,时间延迟和磁道数量。

在描述卡号的部分中,应该理解,最后两张卡始终“保留”用于内部功能-切换音量和睡眠模式。

行动方案
/*  A0 -   MP3 (  )
 *  pin 0, 1 -   ()
 *  pin 2 -   
 *  pin 4 -   MP3 ( )
 *  pin 5 - 
 *  pin 6 -  
 *  pin 7, 8 -  MP3
 *  pin 9 -  
 *  pin 10 -  
 *  pin 11, 12, 13 - SPI 
 */ 


#include <Arduino.h>
#include <SoftwareSerial.h>
#include <JQ6500_Serial.h>
#include <avr/pgmspace.h> //  PROGMEM
#include <SPI.h>
#include <MFRC522.h>
#include <avr/sleep.h>
#include <avr/power.h>

#define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC (before power-off) 
#define adc_enable() (ADCSRA |= (1<<ADEN)) // re-enable ADC

#define RST_PIN 9
#define SS_PIN 10
#define mp3Pin 4
#define mp3Busy A0
#define readerPin 6
#define tonePin 5
#define ledPin 3
#define offDelay 70000 //  
#define winkStep 1500 //   
#define on 150 //  ""
#define off 80 //  ""
#define tOut1 0 //         (x - / x1 -  )
#define tOut11 500
#define tOut2 14000
#define tOut21 15000
#define tOut3 29000
#define tOut31 30000
#define tOut4 44000
#define tOut41 45000
#define tOut5 60000
#define tOut51 65000
#define tShake 2000 //     
#define nShakeQ 10 //     
#define introQ 5 //  -
#define minVol 18 //  
#define midVol  22 //  
#define maxVol 25 //  


unsigned long dimDelay, winkStepDelay, onDelay, ledOffDelay, tShakeDelay;
boolean ledOn, ledOff, eyes, pwm;
int wink;
int pwmVal;

boolean playON = false;
boolean pwmUp = false;
byte pwmStep = 1;


unsigned int playFile;

MFRC522 mfrc522(SS_PIN, RST_PIN);       //  MFRC522
unsigned long uidDec, uidDecTemp; //       
byte bCounter, readBit, nShake, rnd;
byte vol = midVol; //     
unsigned long ticketNumber;
unsigned long offTimeOut = 0; //   
boolean mp3ON = false; //   
boolean isInt = false; //   

byte ticketQ = 32; //     (  -  )
byte fileQ = 0; //  MP3-

//    (  ,    ),         .   ,    
PROGMEM const uint32_t ticketSet[]  = {2515217196, 2540548337, 2490970856, 2486466332, 2485920633, 35870611, 37836807, 37836806, 2377004330, 2522873668, 2514304566, 23472725, 2485702426, 2374853555, 2374391583, 2492957469, 2486467162, 2489280075, 2488031661, 2491726641, 2491720188, 2490968782, 2490968783, 2488900952, 2489969016, 2506562651, 2375447052, 2375449579, 2489276180, 2483389692, 2486466331, 2484789326};

JQ6500_Serial mp3(8,7); //  

void enterSleep()
{
 mp3.playFileNumberInFolderNumber(01, 005); // -
 mp3.playFileNumberInFolderNumber(01, 005); // -
 delay(2500);
 tone(tonePin, 800, 500);
 delay(500); 
 digitalWrite(readerPin, LOW); 
 digitalWrite(mp3Pin, LOW);
 digitalWrite(ledPin, LOW);
 pinMode(ledPin, INPUT);
 pinMode(readerPin, INPUT);
 pinMode(mp3Pin, INPUT);
 
  adc_disable();

  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  
  sleep_enable();
  
  sleep_mode();
  
 sleep_disable();
 power_all_enable();

 adc_enable();
 tone(tonePin, 450, 500);
 pinMode(ledPin, OUTPUT);
 pinMode(readerPin, OUTPUT);
 pinMode(mp3Pin, OUTPUT);
 digitalWrite(ledPin, LOW);
 digitalWrite(readerPin, HIGH); 
 digitalWrite(mp3Pin, HIGH);
 SPI.begin();            //  SPI
 mfrc522.PCD_Init();     //  MFRC522
 mp3Init();
 offTimeOut = millis();
 ledOffDelay = millis();
 mp3.playFileNumberInFolderNumber(01, 001); // -
 mp3.playFileNumberInFolderNumber(01, 001); // -
 delay(500);
 playON = false; 
 mp3ON = true;
}

void wakeUp() {
   detachInterrupt(0);
   ledOffDelay = millis();
   if (isInt == false) { //  
    isInt = true;
   }
   attachInterrupt(0, wakeUp, LOW); 
}

void setup() {
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(0, wakeUp, LOW);
  pinMode(readerPin, OUTPUT);  
  digitalWrite(readerPin, HIGH);
  SPI.begin();            //  SPI
  mfrc522.PCD_Init();     //  MFRC522
  pinMode(mp3Pin, OUTPUT);
  mp3Init();
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, LOW);
  eyes = false;
  ledOn = false;
  ledOff = false;
  dimDelay = millis();
  winkStepDelay = millis();
  wink = 0;
  pwmUp = true; //    
  pwmVal = 0;
  ledOffDelay = millis();
  offTimeOut = millis();  
  mp3.playFileNumberInFolderNumber(01, 001); // -
  mp3.playFileNumberInFolderNumber(01, 001); // -
  delay(500);
  playON = false; 
  mp3ON = true;
}

void loop() {

rnd = random(1, fileQ-1);

if ((millis() - offTimeOut) > offDelay) { //  

     enterSleep();

 } else { 

 ledWink(); //   


 if (isInt == true) {
  
  offTimeOut = millis(); //    -  ,    

  if (nShake == 0) {
    tShakeDelay = millis();
  }
  
  if ((millis() - tShakeDelay) < tShake){
    nShake = nShake + 1;
  } else {
    tShakeDelay = millis();
    nShake = 0;
  }

   isInt = false;
 }

 if (nShake > nShakeQ) {
  playRandom();
  nShake = 0;
 }

//    

playPreset(); //     


//   
  if (mp3ON == true) {
   
   if (playON == true) { //  ,   
    offTimeOut = millis(); //   
   }

   nShake = 0;

   eyesPWM(); //  
   

    //  MP3
    if(analogRead(mp3Busy) < 250) { //    -  ,  
     mp3ON = false; 
     playON = false;
     digitalWrite(ledPin, LOW);
    }
  }
  
 scanPlay(); //   
 
 }
}


void setBitsForGood(byte daBeat) {


  
        if (daBeat == 1) {
                bitSet(ticketNumber, bCounter);
                bCounter=bCounter+1;
                }
        else {
                bitClear(ticketNumber, bCounter);
                bCounter=bCounter+1;
        }
}

//    MP3
void mp3Init() {
  digitalWrite(mp3Pin, HIGH);
  delay(100);
  mp3.begin(9600);
  mp3.reset();
  mp3.setVolume(vol);
  mp3.setLoopMode(MP3_LOOP_NONE);

  fileQ = mp3.countFiles(MP3_SRC_SDCARD); //    
  fileQ = fileQ - introQ; //  

}


//   
void playRandom() {
   tone(tonePin, 450, 500);
   delay(500);  
   playFile = rnd;
   mp3ON = true;
   playON = true;
   mp3.playFileByIndexNumber(playFile);
   mp3.playFileByIndexNumber(playFile);
   mp3.playFileByIndexNumber(playFile);  
   delay(500);
}

// 
void ledWink() {

 //     
if ((millis() - winkStepDelay) > winkStep) { //  

// 
  if (eyes == true) { //   

    if (ledOn == false) {
      onDelay = millis(); //  
        ledOn = true; //  ,   
    }
 
    if ((millis() - onDelay) > on) { //   
      digitalWrite(ledPin, LOW); //   
      eyes = false; //   
    }

  }

// 
  if (eyes == false) { //   
    
    if (ledOff == false) {
      ledOffDelay = millis(); //  
        ledOff = true; //  ,   
    }

    if ((millis() - ledOffDelay) > off) { //   
      digitalWrite(ledPin, HIGH); //  
      eyes = true; //   
    }
  }

  if (ledOn == true && ledOff == true) { //    (  /)
    wink = wink+1;
    ledOn = false;
    ledOff = false;    
  }

  if (wink == 4) { //   /
     winkStepDelay = millis();
     wink = 0;
 }

 }

}

//     
void playPreset() {

 if (mp3ON == false) {
  
  if ((millis() - offTimeOut) > tOut2 && (millis() - offTimeOut) < tOut21) {
    mp3.playFileNumberInFolderNumber(01, 002); //   /001/002.mp3      tOut21 .
    mp3ON = true; 
    delay(500);
  }

  if ((millis() - offTimeOut) > tOut3 && (millis() - offTimeOut) < tOut31) {
    mp3.playFileNumberInFolderNumber(01, 003); //   /001/003.mp3      tOut31 .
    mp3ON = true;
    delay(500);
   }  

  if ((millis() - offTimeOut) > tOut4 && (millis() - offTimeOut) < tOut41) {
    mp3.playFileNumberInFolderNumber(01, 004); //   /001/004.mp3      tOut41 .
    mp3ON = true;  
    delay(500); 
  }    

    
 }
  
}


// 
void eyesPWM(){

 if ((millis() - winkStepDelay) > (pwmStep)/4) {
   //     MP3 
    if (pwmUp == true) {
      if (pwmVal < 128) { //   254 -    (    255,      )
        analogWrite(ledPin, pwmVal);
        pwmVal = pwmVal + 1;
        pwmStep = pwmStep - 1;
        winkStepDelay = millis();
      } else {
            pwmUp = false;
            pwmStep = 1;
            pwmVal = 128;
      } 
    }
    
    if (pwmUp == false) {
      if (pwmVal > pwmStep) {
        analogWrite(ledPin, pwmVal);
        pwmVal = pwmVal - 1;
        pwmStep = pwmStep +1 ;
        winkStepDelay = millis();
      } else {
            pwmUp = true;
            pwmStep = 128;
            pwmVal = 1;
      } 
    }
    }
  
}

//   
void scanPlay() {

 if (fileQ > 0) {
          //   
        if ( ! mfrc522.PICC_IsNewCardPresent()) {
                return;
        }

        //  
        if ( ! mfrc522.PICC_ReadCardSerial()) {
                return;
        }

        uidDec = 0;

//   ,   

        byte status;
        byte byteCount;
        byte buffer[18]; //   (16  + 2   ) 
        byte pages[2]={4, 8}; //   
        byte pageByte; //   
        
        byteCount = sizeof(buffer);
        byte bCount=0;
                

        mfrc522.MIFARE_Read(4, buffer, &byteCount);
        
          
                                bCounter = 0; // 32-   
                                
                                //  0-3
                                for (bCount=0; bCount<4; bCount++) {
                                        readBit = bitRead(buffer[6], (bCount+4));
                                        setBitsForGood(readBit);
                                }

                                //  4 - 27
                                for (pageByte=5; pageByte > 2; pageByte--) {
                                        for (bCount=0; bCount<8; bCount++) {
                                                readBit = bitRead(buffer[pageByte], bCount);
                                                setBitsForGood(readBit);
                                        }
                                }

                                //  28-31
                                for (bCount=0; bCount<4; bCount++) {
                                        readBit = bitRead(buffer[2], bCount);
                                        setBitsForGood(readBit);
                                }

                               for (byte ticketNum = 0; ticketNum < ticketQ; ticketNum++) {
                                unsigned long ticketTemp = pgm_read_dword_near(ticketSet + ticketNum);
                                if (ticketTemp == ticketNumber) {
                                  tone(tonePin, 450, 500);
                                  delay(500); 
                                  if (ticketNum < (ticketQ - 2)) {
                                    if ((ticketNum+1) < fileQ) {
                                      digitalWrite(ledPin, HIGH);
                                       playFile = ticketNum+1;
                                      mp3ON = true;
                                      playON = true;
                                      mp3.playFileByIndexNumber(playFile);
                                      mp3.playFileByIndexNumber(playFile);
                                      mp3.playFileByIndexNumber(playFile);
                                      delay(500);
                                      }
                                      return;
                                  } else {
                                    if (ticketNum == ticketQ-1) {
                                      enterSleep(); // 
                                    }
                                    if (ticketNum == ticketQ-2) {
                                      setVol(); //  
                                    }
                                  }
                                  
                                }
                               }
                        // }
                
        // Halt PICC
    mfrc522.PICC_HaltA();    


  }
  
}

//    
void setVol() {

  switch (vol) {
    case maxVol:
      vol = minVol;
      break;
    case midVol:
      vol = maxVol;
      break;
    case minVol:
      vol = midVol;
      break;
  } 

  mp3.setVolume(vol);
  
}




由代码大致还原的图应如下所示(如果错误仍然存​​在,我深表歉意):





这里:

  • U1 = ATmega328p
  • UHT7333 = HT7333
  • C1 = 0,1
  • R2 = ~50
  • R3 = 220
  • R4 = 1
  • M1 =
  • R4 = 1
  • SP1 = 8
  • Piezo =
  • T1 = NPN- 0,3
  • U2 = JQ6500 : 1 — TX, 2 — RX, 3 — GND, 4 — VCC, 5 — BUSY, 6 — SPK+, 7 — SPK -


哈伯斯·希Habrauser Chigin)对此 深表感谢,他的成就显着改善,使所有经济状况井然有序。但是请注意,PNP晶体管已经在这里,并且播放器的电源管理必须反转(即,通过此连接,播放器将控制器引脚的低电平打开,然后关闭-高电平):



在当前配置下,容量约为2500 mAh的电池可持续使用一天用刺猬。不必多说,但是您需要了解时间表总是不同的,我希望大部分精力都花在主动模式下。在某种程度上,这使我们可以忽略所有刺猬电子产品完全无法进入睡眠的失败。

如果您在计算近似预算时遇到麻烦,则会得到以下信息(以美元为单位):

  • 球员:8.9
  • ATmega328p:1.1
  • 开发板:0.28
  • 读者RC522:2.21
  • 动态头:0.99
  • 压电陶瓷发射器:0.77
  • LED:0.12
  • 晶体管:0.14
  • 稳定剂:0.13
  • 震动感应器:0.13
  • 肥皂盘:0.99
  • 行动电源:0.75
  • 18650电池:3.9
  • Qi充电适配器:1.65
  • 存储卡:3
  • 刺猬伊芙琳:6


总计31.06,但实际上更多,因为您仍然需要使用电线进行连接以及诸如热熔胶,双面胶带和蓝色电工胶带之类的其他小物件。

可能必须有某种特别重要的最后一句话,但我绝对不知道。可以说孩子对玩具很满意,这肯定比打开笔记本电脑更好(通常更快)。

ps。我知道蓝牙扬声器,即使您放了一只如此可爱的刺猬,也有所不同。

Source: https://habr.com/ru/post/zh-CN395423/


All Articles