Komunikace Arduina a PC

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod kosan123 16. 6. 2015 10:58

Zdravím,
dělám na projektu s Arduinem a potřebuju vyřešit nějakým způsobem komunikaci arduino -> PC.
Jen na začátek uvedu, že jsem začátečník a v C# víceméně nic moc neumím, ve Wire (ano vím, že je to podobné jako nějaké céčko) taky začínám, ale tak rád se učím, takže na tomhle dělám.

Co potřebuju - na PC spustit program (konzolová aplikace?), který bude naslouchat na portu COM8 frekvence 9800 baudů a při přijmutí nějaké zprávy (dejme tomu ASCII znaku) provede nějaký příkaz, komunikce probíhá přes USB.

Otázka je, jak to mám se svými mizernými základy udělat? Případně dá se najít nějaký už hotový program?

Původně jsem myslel, že přes Arduino naemuliju klávesnici, ale mega to bohužel neumí, tou emulací klávesnice by se to všechno vyřešilo. Plán byl, že až arduino pošle příkaz (klávesu), tak se PC "uzamkne", nebo se uživatel odhlásí, tohle mi ale sebralo vítr z plachet.
kosan123
Junior
Uživatelský avatar

Odeslat příspěvekod koenzim 16. 6. 2015 13:10

Neviem teda ake špeciálne máš Arduino, ale emulácia klávesnice je vcelku triviálna (HID keyboard):
http://www.arduino.cc/en/Reference/MouseKeyboard
https://www.sparkfun.com/tutorials/337
koenzim
Junior
Uživatelský avatar

Odeslat příspěvekod kosan123 16. 6. 2015 13:25

To já vím, jenže tohle na Unu a Mega nefunguje (psal jsem to tam).
kosan123
Junior
Uživatelský avatar

Odeslat příspěvekod vladimir 16. 6. 2015 15:13

Mělo by stačit nahrát nový firmware a i Arduino Mega bude umět emulaci klávesnice. http://hackaday.com/2012/06/29/turning- ... -keyboard/
vladimir
Expert
Uživatelský avatar

Odeslat příspěvekod kosan123 16. 6. 2015 16:54

Na tohle jsem taky narazil, ale spíš jak tam pak dostat zkompilovaný program, protože v IDE mi to Keyboard.begin() nebo Mouse.begin() nevezme, knihovny pro to nejsou. Pokud vím, tak verze FW v arduinu na ide vliv mít nebude.
kosan123
Junior
Uživatelský avatar

Odeslat příspěvekod vladimir 16. 6. 2015 18:14

Podle příkladů na stránce http://mitchtech.net/arduino-usb-hid-keyboard/ se to dělá bez těch knihoven.
Kódy kláves a jejich kombinací jsou popsané na stranách 53 až 59 dokumentu http://www.usb.org/developers/hidpage/Hut1_12v2.pdf
vladimir
Expert
Uživatelský avatar

Odeslat příspěvekod kosan123 16. 6. 2015 20:49

Příklady jsem viděl, budu se na to soustředit.
Dočasně jsem to obešel tak, že jsem vytvořil v pc v c# přes System.IO.Ports komunikační port, přes který posílám do pc příkazy, program pak podle odeslaných bytů dělá, co by měl.

Jinak proletěl jsem návody na přehrání FW na Mega, ale nikde jsem nenašel schéma, kam přesně mám umístit těm rezistor na zadní straně arduina, abych se dostal do dfu mode. Našel jsem obrázky jen na Uno, což je ale nepoužitelné, protože že zadu má rozmístění jiné.
Čísla kláves se dají i snímat, tzn třeba levý winkey má hodnotu 91.
kosan123
Junior
Uživatelský avatar

Odeslat příspěvekod Just_jo 16. 6. 2015 20:56

Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod kosan123 17. 6. 2015 05:43

Mělo bohužel není, tuhle stránku jsem taky viděl, ale bohužel pro mě je tu ukázka z Una, kam umístit ten rezistor na Arduino Mega je mi záhadou.
kosan123
Junior
Uživatelský avatar

Odeslat příspěvekod vladimir 17. 6. 2015 10:38

Já bych to chápal tak, že ten rezistor se pájí jenom na nejstarší NE-SMD verzi Arduina Uno, proto nemůžeš najít návod na přiletování rezistoru na Mega (všechny Mega jsou SMD). Odhadem ten návod psali v době, kdy neexistovalo nic jiného, než Uno a SMD-Uno a pak ho doplňovali, ale ten nadpis zapomněli upravit.

Arduino Mega od Rev.2 dokonce ani nepotřebuje ani resetovat čip a můžeš přímo použít Atmel's FLIP software, píšou zde: http://www.arduino.cc/en/Main/ArduinoBoardMega2560

(Za 150Kč si objednej z Číny 32U4 *duino a nemusíš nic řešit).
vladimir
Expert
Uživatelský avatar


Odeslat příspěvekod kosan123 17. 6. 2015 14:54

Paráda, děkuju.
Prozatím jsem to udělala tak, že v C# jsem napsal prg co simuluje tu klávesnici (stisky kláves) a zároveň poslouchá na com 8, kde mu arduino pošle příkaz.
Jenže mám problém, že na zamčenén pc (tzn přihlašovací obrazovka, kde by se měl jen stisknout Enter = 13) tak mi to bohužel nefunguje, protože pravděpodobně (?) nemůže ten program simulovat na zamčené obrazovce.
Idea je taková, že až přijde příkaz pc se zamkne (to už vyřešené mám) pak by ho zase pomocí jiného příkazu dokázalo odemknout, ale to se mi nedaří. Nějaká rada?
kosan123
Junior
Uživatelský avatar

Odeslat příspěvekod Just_jo 17. 6. 2015 15:13

Ono už od OS Vista je po CTRL+ALT+DEL stav, kdy klávesnici a myš ovládá pouze systém ( možná to jde obejít, ale byl by to bezpečnostní bug ).

Napadla mě varianta vlastního uzamčení ( aplikace, co imituje přihlašovací plochu - žádná lišta žádné ikony, nejde zminimalizovat a nereaguje na systémové klávesy ). To jsem kdysi udělal pro XP a i na Vistách to šlo ( DELPHI )

StackOverflow
Just_jo
Junior
Uživatelský avatar

Odeslat příspěvekod kosan123 17. 6. 2015 15:24

Tohle je jedno až věci co jsme přesně hledal, děkuju.

Edit: emm je mi to blbý, ale jak docílím toho, že moje windows form app nepůjde minimalizovat, spustí se maximalizovaná a nepůjde křížkem sundat?

Edit2: dobrý takže celou obrazovku + sebrání horní lišty mám pomocí
Kód: Vybrat vše
            this.FormBorderStyle = FormBorderStyle.None;
            this.WindowState = FormWindowState.Maximized;

killnout proces zvládnu taky pomocí
Kód: Vybrat vše
            try
            {
                foreach (Process proc in Process.GetProcessesByName("explorer"))
                {
                    proc.Kill();
                }
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }

jenže ten explorer (myslím tím rozhraní windows) se vždy po chvilce sám restartuje, co s tím?
Jinak zbývá mi ještě dál blokování klávesnice, jak na to?
kosan123
Junior
Uživatelský avatar

Odeslat příspěvekod kosan123 18. 6. 2015 17:14

tak pro budoucí generace řešení problému.

komunikace s PC přes com port 8 při frekvenci 9600 baudů
Kód: Vybrat vše
using System.IO.Ports;
            SerialPort ComPort = new SerialPort("COM8", 9600, Parity.None, 8, StopBits.One);
            ComPort.Open();



zakázání zavření aplikace uživatelem - nefunkční alt+ f4
Kód: Vybrat vše
       
protected override void OnFormClosing(FormClosingEventArgs e) // znemožnění uživatelského vypnutí
        {
            switch (e.CloseReason)
            {
                case CloseReason.UserClosing:
                    e.Cancel = true;
                    break;
            }

            base.OnFormClosing(e);
        }     


maximalizované spuštění bez lišty a bez dolního řádku windows (nevím, jak se to jmenuje)
Kód: Vybrat vše
            this.FormBorderStyle = FormBorderStyle.None;
            this.WindowState = FormWindowState.Maximized;


řešení Alt + Ctrl + Del - resp task manager, přes timer na každých 500 mls
Kód: Vybrat vše
        private void kill_explorer (object sender, EventArgs e) // pro timer, který killne explorer.exe a taskmgr (task manager)
        {
            foreach (Process proc in Process.GetProcesses())
            {
                if (proc.ProcessName.StartsWith("explorer"))
                {
                    proc.Kill();
                }
              if (proc.ProcessName.StartsWith("taskmgr"))
                {
                    proc.Kill();
                }     
            }
        }


always on top
Kód: Vybrat vše
        //začátek importu dat pro always on top
        static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
        static readonly IntPtr HWND_NOTOPMOST = new IntPtr(-2);
        static readonly IntPtr HWND_TOP = new IntPtr(0);
        static readonly IntPtr HWND_BOTTOM = new IntPtr(1);
        const UInt32 SWP_NOSIZE = 0x0001;
        const UInt32 SWP_NOMOVE = 0x0002;
        const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
        //konec always on top

        private void Form1_Load(object sender, EventArgs e) // naběhne hned po spuštění
        {           
            SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS); //spuštěn programu always on top
        }

kosan123
Junior
Uživatelský avatar


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků