網(wǎng)上有很多關(guān)于自制pos機(jī)電池,如何制作深受兒童喜愛的木制收音機(jī)的知識(shí),也有很多人為大家解答關(guān)于自制pos機(jī)電池的問題,今天pos機(jī)之家(m.dsth100338.com)為大家整理了關(guān)于這方面的知識(shí),讓我們一起來看下吧!
本文目錄一覽:
自制pos機(jī)電池
這個(gè)項(xiàng)目的初心是,制作一個(gè)適合您孩子使用的小巧方便的收音機(jī)。讓他們播放自己喜歡的歌曲或童話故事。這一切都集中在木盒子里面!
使用硬件
Arduino Nano R3 http://www.dfrobot.com.cn/goods-875.htmlDFPlayer Mini 播放器模塊 http://www.dfrobot.com.cn/goods-891.html起源
當(dāng)我第一眼看到Horbert收音機(jī)時(shí),我就立刻想為我2歲的女兒制作出類似的東西。但是我希望讓它變得更加小巧和方便。也許需要在那里放置一些燈。我們確實(shí)也是這么做的。收音機(jī)在您手中可以變得更加小巧。它包含7個(gè)顏色按鈕、小巧而強(qiáng)大的揚(yáng)聲器,以及MP3播放器,能夠播放SD卡中的歌曲或童話故事。最后但同樣重要的是,它在表殼周圍設(shè)有彩虹LED,以創(chuàng)造出漂亮的環(huán)境光,能在睡前童話故事中作為夜燈使用。
木箱
我希望讓箱子變成木制的。它看起來不錯(cuò),我喜歡用木頭工作。幸運(yùn)的是,同時(shí),我的朋友給我?guī)砹艘话鸭す馇懈顧C(jī)切割膠合板。它太棒了!各種形狀都能夠在幾秒鐘內(nèi)切割完畢,而且精確度極高!圖形文件附在本文底部。
尺寸:90x140x35mm
[media=x,500,375]https://v.qq.com/x/page/e087727f71w.html[/media]
表殼采用4毫米膠合板并切割成8個(gè)部分。前后板、四個(gè)側(cè)板、電池和揚(yáng)聲器蓋。首先,我將四個(gè)側(cè)板粘在一起形成整個(gè)框架。我還使用了其它一些木頭對(duì)角落進(jìn)行加固,因?yàn)槲蚁M鼈冊(cè)谧詈笫菆A形的,所以我需要在那里增加一些材料才能將角落向下鉆一點(diǎn)。
在我粘貼前面部分前,我在前板和框架之間嵌入一層薄薄的有機(jī)玻璃。這將允許我稍后連接LED,以便在收音機(jī)周圍創(chuàng)建漂亮的閃亮環(huán)。某些額外的設(shè)計(jì)觸感觸動(dòng)了我。我使用4mm有機(jī)玻璃,將其切成粗糙的形狀以適應(yīng)整個(gè)框架。有機(jī)玻璃使用超級(jí)膠水粘在框架和前板上。不必?fù)?dān)心重疊的有機(jī)玻璃,它將最終打磨成型。
環(huán)境彩虹燈
為了在黑暗環(huán)境下增加額外的炫酷效果,我在表殼周圍增加了4個(gè)RGB LED。先前插入的有機(jī)玻璃將允許發(fā)射的光在殼體周圍擴(kuò)散。我使用了菊鏈?zhǔn)綐?biāo)準(zhǔn)可尋址WS2818 RGB LED。木箱的每個(gè)角落都分布了一個(gè)LED燈。
首先,使用萬能膠將這些微型LED粘合到有機(jī)玻璃頂部角落。不要忘記標(biāo)記引腳1,否則您將無法正確連接它們-請(qǐng)參閱永久標(biāo)記所做的微型黑色標(biāo)記。其次,將它們粘連在一起。我采用的工具是0.3mm銅線和透明絕緣材料。
VCC到VCC
GND至GND
OUT到下一個(gè)LED的IN
完成木箱制作
在將背板粘貼到位之前,在框架一側(cè)切割小孔以適合Arduino Nano USB端口、MP3播放器SD卡插槽和電源開關(guān)。我決定將它們放置在收音機(jī)左側(cè)。我使用小刀和方形文件,切割出精確的孔洞。保證這些孔洞盡量少,并且盡可能地隱藏。
現(xiàn)在是時(shí)候?qū)⒈嘲逭澈系轿?,并打造收音機(jī)最終形狀了。利用萬能膠套裝后,我使用臺(tái)式砂光機(jī)塑造圓角,并對(duì)所有表面進(jìn)行清理。為了保護(hù)邊緣,我還給它們打了一點(diǎn)點(diǎn)萬能膠。保護(hù)從RGB LED出來的電線,以防止在打磨時(shí)損壞絕緣層。
最后一步是將揚(yáng)聲器蓋環(huán)粘在揚(yáng)聲器孔上。它將使揚(yáng)聲器保持在原位。作為最后的保護(hù)措施,我已經(jīng)涂了4層清漆。
揚(yáng)聲器蓋網(wǎng)
為了避免人員好奇損壞揚(yáng)聲器,我希望在揚(yáng)聲器孔上放置一些網(wǎng)狀物。但是由于我沒有3D打印機(jī),而且我沒有其他任何合適的工具,我只好通過將1mm黃銅棒焊接成網(wǎng)狀物來創(chuàng)建這種網(wǎng)狀物。
事實(shí)證明它很完美。它非常堅(jiān)固。沒有什么能夠穿透這層網(wǎng),而且它也看起來很漂亮。為了隱藏焊點(diǎn),我噴了白色漆。使用萬能膠將揚(yáng)聲器蓋粘在收音機(jī)中。
收音機(jī)里面
收音機(jī)核心是我最喜歡的Arduino Nano板。它能夠讀取7個(gè)按鈕的狀態(tài),控制DFPlayer迷你MP3播放器,以及可尋址RGB LED。DFPlayer是一款小巧的MP3播放器,內(nèi)置SD卡插槽和聲音放大器,能夠?qū)Ω哌_(dá)3W的揚(yáng)聲器進(jìn)行處理。我使用了一個(gè)功率為0.5W的8歐揚(yáng)聲器。
按鈕
首先,創(chuàng)建按鈕平臺(tái)。收音機(jī)包含7個(gè)可編程按鈕,總共焊接到一小塊穿孔板上。最初我希望每個(gè)按鈕都采用不同的顏色,以播放7種不同的歌曲。但是它看起來并不好看,所以我決定用一個(gè)黑色按鈕來改變音量,用黃色、藍(lán)色和紅色對(duì)來選擇3組歌曲的上一首或下一首歌。每個(gè)按鈕連接到Arduino的一個(gè)數(shù)字引腳,它們都通過1Kohm電阻接地。
按鈕的穿孔板間距并非標(biāo)準(zhǔn)和友好,因此我不得不將它們放入殼體的孔洞中,并使用自由形式技術(shù)將它們與一塊黃銅棒焊接在一起?,F(xiàn)在當(dāng)按鈕布局固定后,是時(shí)候?qū)⑺箳斓酱┛装迳?,并為每個(gè)按鈕添加7根電線。最后,我為共同的接地點(diǎn)焊接了第8根電線。
整體組裝
現(xiàn)在,當(dāng)您已經(jīng)完成所有零件制作后,就可以結(jié)束這項(xiàng)工作了。我首先焊接了Arduino Nano、DFPlayer、按鈕、揚(yáng)聲器、RGB LED、電池和收音機(jī)外部的所有電線,因?yàn)橐坏┎迦胨鼈?,機(jī)箱內(nèi)就沒有足夠空間。它還允許我在所有組件不可逆地粘在內(nèi)部之前測(cè)試外殼電子設(shè)備。
首先,我使用Mamut Glue將Arduino Nano、DFPlayer和開/關(guān)開關(guān)插入并粘貼到表殼中。 Mamut Glue讓我擁有更多的時(shí)間,精確地將板材放在里面,并且將來會(huì)更好地保持它們,因?yàn)樗庆`活可調(diào)的。接下來是揚(yáng)聲器蓋網(wǎng)底部再次安裝Mamut Glue的揚(yáng)聲器。最后的環(huán)節(jié)是按鈕和電池組。電池組位于背面孔洞中,方便輕松更換電池。后來我用一節(jié)9V電池更換了4xAA電池。它的重量更輕。
大功告成!我們來編程吧!
播放歌曲!
我只是使用了DFPlayer網(wǎng)站的示例,并添加了一些代碼來讀取按鈕,并對(duì)我的Ever Blooming Mechanical Tulip(“永不凋謝的機(jī)械郁金香”)項(xiàng)目的LED進(jìn)行控制。代碼非常簡(jiǎn)單。這簡(jiǎn)直不像是我做出來的,但是它卻非常有效。
它要求SD卡包含3個(gè)名為01、02、03的文件夾,以對(duì)應(yīng)每種顏色。每個(gè)文件夾中最多可包含255首歌曲,名為001.mp3到255.mp3。我寧愿將文件夾命名為紅色、藍(lán)色和黃色,但DFPlayer不支持。
DFPlayer使用非常方便。它通過串行通信,并具有超級(jí)棒的音樂庫,具有各種功能讀取和控制播放器的狀態(tài)。我只會(huì)添加對(duì)人可讀的文件夾和文件名的功能支持。
代碼
#include "Arduino.h"#include "SoftwareSerial.h"#include "DFRobotDFPlayerMini.h"#include <Adafruit_NeoPixel.h>#define BUTTON_1 A2 // yellow left#define BUTTON_2 A1 // yellow right#define BUTTON_3 A3 // red left#define BUTTON_4 A0 // red right#define BUTTON_5 A4 // blue left#define BUTTON_6 2 // blue right#define BUTTON_7 3 // black#define BUTTONS_COUNT 7#define BUTTON_RELEASED 0#define BUTTON_PRESSED 1#define BUTTON_HANDLED 2byte buttonPins[] = {BUTTON_1, BUTTON_2, BUTTON_3, BUTTON_4, BUTTON_5, BUTTON_6, BUTTON_7};byte buttonState[] = {0, 0, 0, 0, 0, 0, 0};#define NEOPIXEL_PIN 9#define RED 0#define GREEN 1#define BLUE 2float currentRGB[] = {0, 0, 0};float changeRGB[] = {0, 0, 0};byte newRGB[] = {0, 0, 0};Adafruit_NeoPixel pixels = Adafruit_NeoPixel(4, NEOPIXEL_PIN, NEO_GRB + NEO_KHZ400);SoftwareSerial playerSerial(7, 6); // RX, TXDFRobotDFPlayerMini player;#define FOLDER_RED 0#define FOLDER_BLUE 1#define FOLDER_YELLOW 2byte currentSong[] = {0, 0, 0}; // 1 to size of folderbyte folderSizes[] = {0, 0, 0};byte volume = 5;byte lightIntensity = 0;void setup() { randomSeed(analogRead(A7)); playerSerial.begin(9600); Serial.begin(115200); pixels.begin(); pixelsUnifiedColor(0); for (int i = 0; i < BUTTONS_COUNT; i++) { pinMode(buttonPins, INPUT_PULLUP); buttonState = BUTTON_RELEASED; } Serial.println(); Serial.println(F("DFRobot DFPlayer Mini Demo")); Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); if (!player.begin(playerSerial)) { //Use softwareSerial to communicate with mp3. Serial.println(F("Unable to begin:")); Serial.println(F("1.Please recheck the connection!")); Serial.println(F("2.Please insert the SD card!")); while(true); } Serial.println(F("DFPlayer Mini online.")); //player.EQ(DFPLAYER_EQ_ROCK); player.outputDevice(DFPLAYER_DEVICE_SD); player.volume(volume); //player.play(1); folderSizes[FOLDER_RED] = player.readFileCountsInFolder(FOLDER_RED + 1); folderSizes[FOLDER_BLUE] = player.readFileCountsInFolder(FOLDER_BLUE + 1); folderSizes[FOLDER_YELLOW] = player.readFileCountsInFolder(FOLDER_YELLOW + 1); Serial.println(F("Radio ready."));}void loop() { if (player.available()) { printDetail(player.readType(), player.read()); //Print the detail message from DFPlayer to handle different errors and states. } readButtons(); crossFade(); delay(15);}void readButtons() { for (int i = 0; i < BUTTONS_COUNT; i++) { if (digitalRead(buttonPins) == HIGH) { buttonState = BUTTON_RELEASED; } else if (buttonState == BUTTON_RELEASED) { buttonState = BUTTON_PRESSED; } } if (buttonState[0] == BUTTON_PRESSED) { // yellow left buttonState[0] = BUTTON_HANDLED; playNextInFolder(FOLDER_YELLOW); } else if (buttonState[1] == BUTTON_PRESSED) { // yellow right buttonState[1] = BUTTON_HANDLED; playPreviousInFolder(FOLDER_YELLOW); } else if (buttonState[2] == BUTTON_PRESSED) { // red left buttonState[2] = BUTTON_HANDLED; playNextInFolder(FOLDER_RED); } else if (buttonState[3] == BUTTON_PRESSED) { // red right buttonState[3] = BUTTON_HANDLED; playPreviousInFolder(FOLDER_RED); } else if (buttonState[4] == BUTTON_PRESSED) { // blue left buttonState[4] = BUTTON_HANDLED; playNextInFolder(FOLDER_BLUE); } else if (buttonState[5] == BUTTON_PRESSED) { // blue right buttonState[5] = BUTTON_HANDLED; playPreviousInFolder(FOLDER_BLUE); } else if (buttonState[6] == BUTTON_PRESSED) { // black volume = volume >= 15 ? 5 : volume + 5; player.volume(volume); buttonState[6] = BUTTON_HANDLED; }}void playNextInFolder(byte folder) { currentSong[folder]++; if (currentSong[folder] > folderSizes[folder]) { currentSong[folder] = 1; } player.playFolder(folder + 1, currentSong[folder]);}void playPreviousInFolder(byte folder) { currentSong[folder]--; if (currentSong[folder] <= 0) { currentSong[folder] = folderSizes[folder]; } player.playFolder(folder + 1, currentSong[folder]);}void printDetail(uint8_t type, int value){ switch (type) { case TimeOut: Serial.println(F("Time Out!")); break; case WrongStack: Serial.println(F("Stack Wrong!")); break; case DFPlayerCardInserted: Serial.println(F("Card Inserted!")); break; case DFPlayerCardRemoved: Serial.println(F("Card Removed!")); break; case DFPlayerCardOnline: Serial.println(F("Card Online!")); break; case DFPlayerPlayFinished: Serial.print(F("Number:")); Serial.print(value); Serial.println(F(" Play Finished!")); break; case DFPlayerError: Serial.print(F("DFPlayerError:")); switch (value) { case Busy: Serial.println(F("Card not found")); break; case Sleeping: Serial.println(F("Sleeping")); break; case SerialWrongStack: Serial.println(F("Get Wrong Stack")); break; case CheckSumNotMatch: Serial.println(F("Check Sum Not Match")); break; case FileIndexOut: Serial.println(F("File Index Out of Bound")); break; case FileMismatch: Serial.println(F("Cannot Find File")); break; case Advertise: Serial.println(F("In Advertise")); break; default: break; } break; default: break; }}void prepareCrossFade(byte red, byte GREEN, byte blue, unsigned int duration) { float rchange = red - currentRGB[RED]; float gchange = green - currentRGB[GREEN]; float bchange = blue - currentRGB[BLUE]; changeRGB[RED] = rchange / (float) duration; changeRGB[GREEN] = gchange / (float) duration; changeRGB[BLUE] = bchange / (float) duration; newRGB[RED] = red; newRGB[GREEN] = green; newRGB[BLUE] = blue; Serial.print(newRGB[RED]); Serial.print(" "); Serial.print(newRGB[GREEN]); Serial.print(" "); Serial.print(newRGB[BLUE]); Serial.print(" ("); Serial.print(changeRGB[RED]); Serial.print(" "); Serial.print(changeRGB[GREEN]); Serial.print(" "); Serial.print(changeRGB[BLUE]); Serial.println(")");}boolean crossFade() { if (currentRGB[RED] == newRGB[RED] && currentRGB[GREEN] == newRGB[GREEN] && currentRGB[BLUE] == newRGB[BLUE]) { return true; } for (byte i = 0; i < 3; i++) { if (changeRGB > 0 && currentRGB < newRGB) { currentRGB = currentRGB + changeRGB; } else if (changeRGB < 0 && currentRGB > newRGB) { currentRGB = currentRGB + changeRGB; } else { currentRGB = newRGB; } } pixelsUnifiedColor(pixels.Color(currentRGB[RED], currentRGB[GREEN], currentRGB[BLUE])); return false;}void pixelsUnifiedColor(uint32_t color) { for (unsigned int i = 0; i < pixels.numPixels(); i++) { pixels.setPixelColor(i, color); } pixels.show();}void rainbow(int j) { uint16_t i; byte num = pixels.numPixels() - 1; pixels.setPixelColor(pixels.numPixels() - 1, 100, 100, 100); for (i = 0; i < num; i++) { pixels.setPixelColor(i, colorWheel(((i * 256 / num) + j) & 255)); } pixels.show();}uint32_t colorWheel(byte wheelPos) { // Input a value 0 to 255 to get a color value. // The colours are a transition r - g - b - back to r. wheelPos = 255 - wheelPos; if (wheelPos < 85) { return pixels.Color(255 - wheelPos * 3, 0, wheelPos * 3); } if (wheelPos < 170) { wheelPos -= 85; return pixels.Color(0, wheelPos * 3, 255 - wheelPos * 3); } wheelPos -= 170; return pixels.Color(wheelPos * 3, 255 - wheelPos * 3, 0);}
原文轉(zhuǎn)載自:https://www.dfrobot.com/blog-1229.html
轉(zhuǎn)載自:DF創(chuàng)客社區(qū) - 分享創(chuàng)造的喜悅
以上就是關(guān)于自制pos機(jī)電池,如何制作深受兒童喜愛的木制收音機(jī)的知識(shí),后面我們會(huì)繼續(xù)為大家整理關(guān)于自制pos機(jī)電池的知識(shí),希望能夠幫助到大家!
