Stap 5: Rare 6-bits Communicator
Iemand, het zien van mijn klok-garland voor het eerst opgemerkt dat het gebruikt kan worden als een geheime communicatie-apparaat. Nou, waarom niet? Dit is minder nuttig dan de klok of de thermometer, maar kan gebeuren als een goed en leuk speelgoed voor iemand met kinderen.
Het is duidelijk dat een RGB-LED, fysiek bestaande uit drie LEDs met aparte kathoden (of anoden), in feite een 3-bits apparaatstuurprogramma is. Door het verstrekken van haar benen met 0 of 1 waarden geven u het drie stukjes informatie en het toont ze in gekleurde code. Als we kijken naar rood als blauw als een MSB en LSB (of BGR = B000), we kunnen eigenlijk toewijzen zichtbare kleuren naar nummers 0 – 7: zwart voor 0, rood voor 1 (B001), groen voor 2 (B010), oranje (R + G) voor 3 (B011), blauw voor 4 (B100), magenta (R + B) voor 5 (B101), cyaan (G + B) voor 6 (B110) en wit (R + G + B) voor 7 (B111). Het probleem van deze aanpak worden verborgen in de 'zwarte' kleur (nul), zoals wordt het informatief en kan niet worden gebruikt als scheidingsteken. Met slechts drie bits we zal niet zitten kundig voor zenden iets zinvol in slechts één kleur, en we hebben eigenlijk een probleem met het verzenden van nul, zoals het precies hetzelfde als een LED draaide-off uitzien zal en niemand ziet dat we proberen om te communiceren met hen.
De meeste digitale communicatieprotocollen het gebruik van meer dan één kanaal net voor dat: om te laten zien van de ontvanger dat informatie daadwerkelijk wordt verzonden, en het overwegen spanning ontbreken als het getal nul, geen niets. Dit neemt de vorm aan van een latch-signaal, een kloksignaal of sommige andere vervoerder signaal aanwezig is op een extra draad. In ons geval kon hebben we toegevoegd een enkele kleur LED alleen voor dit, maar als we slechts één RGB LED door onze OnePixel Conventie gebruikt, wij niet. Dus het signaal van de drager moet worden verstrekt door de RGB LED en we moeten besteden een van de kanalen, waardoor ons met enige twee bits informatie per één kleur. Dus, als we rood als een drager gebruikt, zal er rood voor 0, oranje voor 1 (B01), magenta voor 2 (B10) en wit voor 3 (B11).
Twee bits zijn niet genoeg, maar we kunnen stapelen ze samen in sequenties. Wat meer is, kunnen we verschillende drager kleuren gebruiken. Bijvoorbeeld, als we rood als drager voor de eerste twee bits gebruikt, groen voor de middelste twee bits en blauw voor de laatste twee bits zullen we een mooie reeks voor drie kleuren 6-bits. We kunnen het gebruiken van 'zwarte' scheidingstekens tussen dergelijke sequenties de inlichtingen duidelijk.
We zijn technisch gezien niet beperkt tot 6 beetjes: we kunnen een vierde kleur, toevoegen met behulp van rood weer als de drager, en zenden volledige bytes. Het probleem hier is dat er twee kleuren in het midden van de reeks, en als ze hetzelfde zijn (zoals, bijvoorbeeld in B00111100-rood, wit, wit, rood of B00011000 – rood, cyaan, cyaan, blauw), het kan moeilijk zijn om ze te decoderen. Gelukkig 6 beetjes vrij genoeg zijn voor het overbrengen van zinvolle berichten.
Controleer de ASCII-tabel. De eerste 32 codes zijn voor stuurcodes, we hoeven ze niet. Ga leestekens, cijfers en het alfabet in hoofdletters, en alle deze symbolen passen in 6 stukjes (64 verschillende waarden). Als we de ASCII-tabel vanuit de ruimte (32) naar _ (95) krijgen we alles wat die we nodig om te communiceren in 6 stukjes. Als een terzijde, vroege personal computers ook sloot geraken lower-case tekens om kosten op karakter generatie chips te verminderen.
OK, is hier de schets van de communicatie geheim. Het neemt om het even wat dat u in het venster van de seriële Monitor typt (omzetten in kleine letters symbolen hoofdletters) en toont het op een één RGB LED. Merk op dat seriële Monitor moet worden ingesteld tot 115200 baud. Het drukt ook de karakter-tabel bij het opstarten voor gemakkelijker decodering (u kunt ook de bovenstaande cheatsheet, blijkt de eerste kleur in een verticale pijl, de tweede in horizontale opvulling en de derde als de stip).
#define RED 3 // pins the RGB LED is connected to#define GREEN 5 #define BLUE 6// the table of colors. This one was calibrated for a 10mm RGB LED uint8_t RGBready[13][3] ={ {255, 0, 0}, // 00xxxx {128, 127, 0}, // 01xxxx {206, 0, 49}, // 10xxxx //{110, 90, 54}, // 11xxxx white {26, 155, 74}, // 11xxxx cyan {0, 255, 0}, // xx00xx {179, 75, 0}, // xx01xx {0, 168, 87}, // xx10xx //{90, 110, 54}, // xx11xx white {158, 10, 87}, // xx11xx pink {0, 0, 165}, // xxxx00 {206, 0, 49}, // xxxx01 {0, 212, 42}, // xxxx10 //{90, 90, 74}, // xxxx11 white {139, 105, 10}, // xxxx11 yellow {0,0,0} // 'black' };uint8_t message[100], count; // char array and counter// below are durations for colors and the 'black' pause between, in ms uint16_t signalDuration=400, pauseBetween=100;void setup() { Serial.begin(115200);// print a character table Serial.println("Character table"); for (uint8_t k=0; k<16; k++) { if (k<10) Serial.print("0"); Serial.print(k); Serial.print(": "); Serial.write(k+32); Serial.print(" "); Serial.print(k+16); Serial.print(": "); Serial.write(k+16+32); Serial.print(" "); Serial.print(k+32); Serial.print(": "); Serial.write(k+32+32); Serial.print(" "); Serial.print(k+48); Serial.print(": "); Serial.write(k+48+32); Serial.println(); } }void loop() {count=0; // drop the character counterwhile (Serial.available()) // read string if available, convert it to our table { uint8_t incomingChar = Serial.read (); // normal characters if (incomingChar>31 && incomingChar<96) {message[count] = incomingChar; count++;} // lower case characters must be converted to upper case else if (incomingChar>96 && incomingChar<123) {message[count] = incomingChar - 32; count++;} }// if there is incoming string, show it on the LED if (count>0){ for (uint8_t k=0; k// the function to color-code and show info on the LED void sendRGBmessage(uint8_t letter) { letter = letter - 32; // convert from ASCII to our format showRGBcolor(letter>>4); // upper 2 bits delay(signalDuration); showRGBcolor(4+((letter>>2)&3)); // middle 2 bits delay(signalDuration); showRGBcolor(8+(letter&3)); // lower 2 bits delay(signalDuration); showRGBcolor(12); // pause between characters delay(pauseBetween); }// the function to do the actual LED turning on // for common anode LED; in case of common cathode remove '255-' chunks void showRGBcolor(byte curLED) { analogWrite(RED, 255-RGBready[curLED][0]); analogWrite(GREEN, 255-RGBready[curLED][1]); analogWrite(BLUE, 255-RGBready[curLED][2]); }