Bat telefon från gamla rotary telefon
Detta är inte en full Instructable som jag misslyckats med att ta ordentlig bilder längs vägen men jag hoppas att göra ännu en av dessa (bättre hoppas jag) och kommer att dokumentera bättre då.
Jag såg den följande Instructable av guidomax: (tack guidomax!) och har en samling av roterande telefoner/delar, jag ville se vad jag kan göra med dem.
Jag bestämmer att jag skulle försöka göra bat telefonen med signalen och presentera det som en gåva till min dotter för semester.
Här är en kort video av den arbetande. Musiken är mycket högre i person.
Mina steg:
1. först som I den ovan Instructable att se om jag kunde få gränssnittet fungerar och som föreslås i Instructable, det var ganska lätt att göra så.
2. jag tog en gammal telefonerna kropp och primas och spray målade röda. Jag gjorde luren också och sladden.
3. jag ville Arduino koden att spela temat från Batman och producera en fladdermus signal när "B", "A", "T", "M", "A", "N" var slagna på telefonen.
Koden var bara ta koden från guidomax och ändra det så istället för en seriell utgång på datorn, det bara kontrolleras för korrekt strängen av nummer som rings. BATMAN är för exanple "228626". När Arduino såg denna sträng, det började låten och vände på signalen bat.
Låten: Jag hade en Adafruit våg sköld som jag hade aldrig använt och såg detta som en möjlighet att kolla upp. Det tog en bra dag för mig att bygga den (det kommer som byggsats) och då finns det ett förfarande som måste följas för att få din wav-fil på skölden. Det är en lätt procedur om du använder iTunes. Bara köpa låten och konvertera den som krävs i menyerna för iTunes och dra till skölden. Utan iTunes det är mer engagerade men Adafruit sidan går du igenom den.
Bat signalen: Flera andra Instructables Visa hur man gör en signal och jag tog vad jag kunde från dem men det var mer eller mindre prova innan jag kom upp med idén slut. Jag skar en vattenflaska om på mitten och lägga ett litet hål i skruvlock. Jag in en röd LED in i det lilla hålet. Jag målade kapsyl svart. För att få bilden att dyka upp ganska bra, behövde jag klippa en liten bat symbol och bifoga det framför flaskan. Det fungerade men jag tror att det måste finnas ett snyggare sätt. Jag heta limmade flaskan till en öppning jag gjorde på baksidan av telefonen (varmt lim är underbar!).
Koden: min ursprungliga idé var att ha flera super heros i koden. dvs om du ringt Batman, du fick signaturmelodi och signalen, om du ringt SUPERMAN, du fick olika musik, etc. Så ser du lite kod som finns för detta ändamål men jag kommit aldrig så långt. Det är bara BATMAN.
Batmanv2 #include < FatReader.h > SdReader kort; Detta objekt innehåller information för kortet WaveHC våg; Detta är enda våg (audio)-objektet, eftersom vi bara kommer att spela en i taget #define DÄMPNINGSTID 100 / / knappen debouncer --från V1--- konstanter int dialHasFinishedRotatingAfterMs = 100; strängar -avsluta från V!--- void setup() {
Detta ett försök att ha flera wav-filer och spela den rätta som
baserat på följd av nummer rings upp på telefonen
om 228626b sedan spela batman temat
#include < SdReader.h >
#include < avr/pgmspace.h >
#include "WaveUtil.h"
#include "WaveHC.h"
FatVolume vol; Detta innehåller information för partitionen på kortet
FatReader rot. Detta innehåller information för filsystemet på kortet
FatReader f; Detta innehåller information för filen vi är spelar
// -----------------
int needToPrint = 0;
int antal;
Mine
int redLed = 8;
int in_from_dial = 7.
int lightOn = 6;
int craddleUp = 9;
int val = låg; variabel för att lagra Läs värdet
//
int lastState = låg;
int trueState = låg;
lång lastStateChangeTime = 0;
int rensat = 0;
int debounceDelay = 10;
Sträng newstring;
char Tester [] = "123".
char Batman [] = "228626";
char Spiderman [] = "774337626";
char Superman [] = "78737626";
char Batgirl [] = "2284475";
Ställ in serieporten
Serial.BEGIN(9600);
putstring_nl ("WaveHC med välja låtar");
putstring ("fri slå ned:"); Detta kan hjälpa till med felsökning, slut RAM är dålig
Serial.println(freeRam()); om detta är under 150 byte kan det stava problem!
Ställa in produktionen stift för DAC kontroll. Detta stift definieras i biblioteket
pinMode (2, utgång);
pinMode (3, OUTPUT);
pinMode (4, OUTPUT);
pinMode (5, OUTPUT);
från V1
pinMode (in_from_dial, ingång); 12
pinMode (Benny, produktionen); 11
pinMode(craddleUp,INPUT); 9
pinMode(redLed,OUTPUT); 9
slutet v1
pin13 LED
pinMode (13, OUTPUT);
om (! card.init(true)) //play med 4 MHz spi om 8MHz inte fungerar för dig
om (! card.init()) {//play med 8 MHz spi (standard snabbare!)
putstring_nl ("kort init. misslyckades!"); Något gick fel, kan skriva ut varför
sdErrorCheck();
While(1); sedan 'stoppa' - gör ingenting!
}
Aktivera optimera Läs - vissa kort kan timeout. Inaktivera om du har problem
card.partialBlockRead(true);
Nu söker vi en FAT-partition!
uint8_t del;
för (del = 0; del < 5; del ++) {/ / vi har upp till 5 platser att titta i
om (vol.init (kort, del))
bryta; Vi hittade en, låter borgen
}
om (del == 5) {/ / om vi slutade inte att hitta en :(
putstring_nl ("ingen giltig FAT-partition!");
sdErrorCheck(); Något gick fel, kan skriva ut varför
While(1); sedan 'stoppa' - gör ingenting!
}
Kan tala om för användaren om vad vi hittade
putstring ("använda partition");
Serial.Print (del, DEC);
putstring (", typ är FAT");
Serial.println(Vol.fatType(),dec); FAT16 eller FAT32?
Försök öppna rotkatalogen
om (! root.openRoot(vol)) {
putstring_nl kan inte ("öppna rotfästa dir!"); Något gick fel,
While(1); sedan 'stoppa' - gör ingenting!
}
Usch! Vi fick tidigare de hårda delarna.
putstring_nl("ready!");
}
Tanken här är
den virande kommer att fortsätta tills mottagaren är pickerd upp
sedan sekvensen av uppringning registreras och kontrolleras
om en träff hittas, slå sedan på ljus (för Batman) och/eller
spela upp låt
void loop() {
vänta tills mottagaren ska hävas
en gång lyfte, kan sedan uppringningen kontrolleras
slå på rött ledde till visar telefonen är vid liv
Val = digitalRead(craddleUp); Läs ingångsstiftet
om (val == hög) {
digitalWrite (redLed, hög);
int läsa = digitalRead(in_from_dial);
om ((millis()-lastStateChangeTime) > dialHasFinishedRotatingAfterMs) {
ratten är inte som rings eller har precis avslutat som rings.
om (needToPrint) {
om det är just färdigt som rings, måste vi sända ner följetongen
linje och återställa räkningen. Vi mod räkningen vid 10 eftersom '0' skickar 10 pulser.
Serial.println (antal % 10, DEC).
nu måste lägga räkningen till teststrängen och sedan testa den mot den
krävs sträng att få en träff
NewString.concat(Count);
Om strängen är lika med Batman, slå på ljus och börja wav-fil
Serial.println(NewString);
Delay(2000);
// --------------------
// -------------- Batman -----------------
om ((newstring.equals(Batman)) || (newstring.equals(Tester))) {
digitalWrite (Benny, hög);
playcomplete ("BATMAN. WAV");
digitalWrite(lightOn,LOW);
}
---Spiderman---
om (newstring.equals(Spiderman)) {
bat_signal();
playcomplete("1.wav");
}
// --------------Superman -----------------
om (newstring.equals(Superman)) {
bat_signal();
playcomplete("1.wav");
}
// -------------- BatGirl -----------------
om (newstring.equals(Batgirl)) {
bat_signal();
playcomplete("1.wav");
}
needToPrint = 0;
Count = 0;
rensat = 0;
}
}
om (läsa! = lastState) {
lastStateChangeTime = millis();
}
om ((millis()-lastStateChangeTime) > debounceDelay) {
Debounce - detta händer när det är stabiliserats
om (läsa! = trueState) {
Detta innebär att växeln har antingen bara gått från stängda -> Öppna eller vice versa.
trueState = behandlingen.
om (trueState == hög) {
öka antalet pulser om det är gått hög.
greve ++;
needToPrint = 1; Vi kommer att behöva skriva ut detta nummer (när ratten är klar roterande)
}
}
}
lastState = behandlingen.
}
annat
{
NewString = "";
digitalWrite (Benny, låg);
digitalWrite(redLed,LOW);
}
}
Spelar en full fil från början till slut med ingen paus.
void playcomplete(char *name) {
Ring vår hjälpare för att hitta och spela detta namn
playfile(Name);
samtidigt (wave.isplaying) {
göra ingenting samtidigt dess spelar
}
dess gjort spelar nu
}
void playfile(char *name) {
se om objektet våg för närvarande gör något
om (wave.isplaying) {/ / redan spelar något, så sluta det!
Wave.stop(); Sluta
}
titta i rotkatalogen och öppna filen
om (! f.open (rot, namn)) {
putstring kunde inte ("öppna filen"); Serial.Print(Name); hemkomst.
}
OK läsa filen och förvandla det till en våg objekt
om (! wave.create(f)) {
putstring_nl ("inte en giltig WAV"); hemkomst.
}
OK dags att spela! starta uppspelningen
Wave.Play();
}
Denna behändiga funktionen returnerar antalet byte för närvarande gratis i RAM, bra för felsökning!
int freeRam(void)
{
extern int __bss_end;
extern int * __brkval;
int free_memory;
om ((int) __brkval == 0) {
free_memory = ((int) & free_memory)-((int) & __bss_end);
}
annat {
free_memory = ((int) & free_memory)-((int) __brkval);
}
återvända free_memory;
}
void sdErrorCheck(void)
{
om (! card.errorCode()) återvända;
putstring ("\n\rSD I/O fel:");
Serial.Print(Card.ErrorCode(), HEX);
putstring (",");
Serial.println(Card.errorData(), HEX);
While(1);
}
Arduinoen jag använde var en UNO
Igen, jag önskar jag hade fler bilder och bättre dokumentation. Nästa gång.
Min dotter tyckte är en snygg present och hon verkade glad men det är vad döttrar gör. :)