Arduino-baserad blå ruta (telefon Phreaking) (3 / 9 steg)
Steg 3: Kod för Schematisk 1
Programmering
Koden för detta nya schema i sin helhet finns här på min pastebin.com profil. Vi kommer att täcka de flesta av de centrala begreppen i syntaxen har jag använt för att skapa denna tutorial. Först och främst Arduino använder ett programmeringsspråk som är objektorienterat; C++. Detta språk är ganska mäktig och driver en hel del moderna webbplats logik, mikro-kontrollanter och mycket mer!
Knappsatsen
Först skapar vi en två dimensionell matris av heltal som vi använder för att hålla frekvenserna som anges per siffra av sidan Wikipedia blå ruta. Vi sätter också en varaktighet som en typedef unsigned heltal array. Dessa heltal är uppspelning längd perioder.
int bb [16] [2] = {/ / MF 0,1,2,3,4,5,6,7,8,9, kp, st, 2400 + 2600, kp2, st2, ss4 super < br > {1300,1500}, {700,900}, {700,1100}, / / 0,1,2
{900,1100}, {700,1300}, {900,1300}, / / 3,4,5
{1100,1300}, {700,1500}, {900,1500}, / / 6,7,8
{1100,1500}, {1100,1700}, {1500,1700}, / / 9, kp, st
{2600,2400}, {1300,1700}, {900,1700}, / / 2400 + 2600, kp2, st2
{2400,2040}, / / ss4 övervakningskommittén
};
< p > uint8_t bbdur [2] = {60,100}. < /p >
Därefter skapar vi en matris matris av nycklar som tecken. Dessa tecken ska användas varje gång en knapp på knappsatsen trycks. Vi också ställa in rader och pins heltal matriser.
char nycklar [4] [4] = {< br > {'1', '2', '3', 'a'},
{'4', '5',' 6', 'b'},
{'7', '8', '9', 'c'},
{'#','0','*','d'}
};
< p > byte rowPins [4] = {5,4,3,2}. ansluta till rad Stifttilldelningar för knappsatsen < br > byte colPins [4] = {9,8,7,6}. ansluta till kolumn Stifttilldelningar för knappsatsen < /p >
Sedan skapar vi en knappsats objekt och en enkel matris av tonar objekt. Eftersom vi spelar toner ur två stift på en gång, gör det bara våra liv enklare när skriva och felsöka koden.
Tonar freq [2]. matris med tonen objekt, nu kan vi spela som freq[0].play(); etc < br > tangentbordet knappsatsen = Keypad(makeKeymap(keys),rowPins,colPins,4,4);
Läsa knappar och spela toner
I funktionen setup() måste vi ange freq [0] och freq [1] stiften för utdata. Detta är enkel. Vi också ange "pin-läge" för 2600-knappen och ange en händelseavlyssnare, som är en procButton() knapp bearbetning anpassad funktion samtal. Detta är händelsestyrd programmering. Detta innebär i princip att vi "lyssna" för nycklar ska pressas, vilket skulle vara en "händelsen." Huvudsakliga loop() funktion är vad hanterar händelser och lyssnare för oss.
Freq[0].BEGIN(11); Initiera våra första tone generator < br > freq[1].begin(12); Initiera våra andra tongeneratorn
pinMode (10, ingång); 2600-knappen
keypad.addEventListener(procButton);
Vi har hållit våra viktigaste loop() metoden enkelt, vilket är bra eftersom det ständigt kallas. Den första raden,
char-knappen = keypad.getKey();
i princip anropar metoden getKey() för objektet knappsatsen att se om och vilken knapptryckningen. Koden,
IF(digitalRead(10)==High) {/ / spela 2600Hz om översta knappen intryckt < br > super(); / / övervakande signalering
}
helt enkelt lyssnar efter spänningen på pin 10 och om hittade, spelar 2600 hz frekvens genom att ringa anpassade signalering super() tillsynsfunktionen. Detta är den första funktionen definieras bara nedan funktionen loop() . Det är också den första funktionen att kalla den anpassade enda frekvens spelar sf() funktion
SF(2600,750);
De argument som vi skickar till denna funktion är frekvensen att spelas och varaktighet. Efter lexically tilldela frekvens och varaktighet till heltal variabler av samma namn, anropar funktionen anpassade sf() endast en enda spela metod på ett enda stift som,
Freq[0].Play(Frequency,duration);
Detta är vår första titt på tonen syntesmetod spela från tonen biblioteket. Så, om du kan tänka dig spela två toner, för flera frekvenser skulle se liknande, men med två stift, som,
Freq[0].Play(Frequency,duration); < br > freq[0].play(frequency,duration);
Och det är precis vad funktionen anpassade Multi-Frequency spelar mf() gör.
Så hur vi behandlar varje knapptryckning i funktionen procButton() ? Med hjälp av en fall-switch logik. Konstanterna "släppt," "pressad," och "hålla" (inte "HELD" av någon konstig anledning), är en del av knappsatsen biblioteket och vi kan använda den i ett fall-switch logik som,
Växla (keypad.getState()) {< br > fall släppt: / / släppa direkt
göra några saker
bryta;
TRYCKT i mål: / / tillfällig
göra några saker
bryta;
Håll i mål: / / HÖLLS (särskilda funktioner)
göra några saker
bryta;
}
Och det är precis vad vi gör. Eftersom funktionen procButton() är en händelsehanterare som anropas av funktionen loop() , får vi en keypadevent-objektet som skickas till det är handler procButton(). Detta objekt kan behandlas som en enkel karaktär - och vi gör det genom enkel subtraktion heltalet 48 från det för att få vilken knapptryckningen från 0-9.
void procButton (KeypadEvent b) {< br > b-= 48.
Nu vi vet vilken knapptryckningen och skickar det till den mf() funktion som använder den flerdimensionella array bb [] som vi skapade tidigare att spela mf toner. Du kanske har märkt att KP (*) och ST (#) inte är 0-9. Detta är korrekt, eftersom de kommer och efter subtraktion är -13 och 6 respektive. Funktionen mf() sedan hanterar dessa som,
} annat if(digit==-13) {< br > siffra = 12. / / *
} annat if(digit==-6) {
siffra = 14. // #
Detta då spelar tonerna som de tilldelas i bb [] multi-dimensionell array.
Vi har nu omfattas alla av de centrala begreppen programmässigt med detta schema (1), låt oss gå vidare till den andra schematiskt och hur vi kan spela WAV-filer som erbjuder ett helt annat ljud till våra blå lådor.
Extra funktioner
Denna kod ger en massiv mängd extra funktioner, inklusive inspelning siffror i och matris för uppspelning och olika arbetslägen. Koden är mycket rättfram Arduino C++-kod. Tryck länge på "A" för att växla mellan olika lägen. Varje gång vi ändra lägen funktionen notifyMode() kommer puls ut en kod av 440 hz pip att låta oss veta vilket läge vi använder. Alla lägen beskrivs fullt ut på min blogg här eller på Wikipedias sida för blå ruta specifikationer.