Aplikace pro ovládání pojízdného robota – Python – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Aplikace pro ovládání pojízdného robota – Python – Fórum – Programujte.comAplikace pro ovládání pojízdného robota – Python – Fórum – Programujte.com

 

3. 11. 2012   #1
-
0
-

Dobrý den, potřeboval bych poradit s aplikací v pythonu kterou "programuju". Začnu postupně, stavím už nějakou dobu takový průzkumný robot, spíše hračku, (http://www.vladis.xf.cz/?p=new_lenka) je tam MCU Atmega328 tvářící se jako Arduino, s počítačem komunikuje pomocí bluetooth modulu který se chová jako bezdrátový seriový port.

V počítači má být aplikace která bude s Lenkou (tak se ten robot jmenuje) komunikovat po tomto seriovém portu. Ovšem s touto aplikací si nevím rady, měl jsem udělanou takovou v Processingu (http://www.processing.org/) ale příjde mi to že ten programovací jazyk si dělá co chce a prostě to není ono. Rozhodl jsem se tedy o předělání řídící aplikace do Pythonu.

No zdá se že to nebyl nejlepší nápad. Python moc neumím, jestli jsem v prváku projel pár lekcí to bylo všechno. Stěží jsem vypotil něco málo a funguje alespoň jednosměrná komunikace, já na straně PC zachytím co zmáčknu za klávesu na klávesnici podle toho pošlu nějaký kod Lence a Lenka to příjme a rozhodne se podle toho co dál, jestli má jet dopředu dozadu či snad stát. Ale potřeboval bych z Lenky přijímat informace o čidlech kterými je vybavena informace o jejím stavu atd. a poté v oknu aplikace tento stav nějak zobrazit, zobrazit že třeba přední IR dálkoměr hlásí překážku. Potřeboval bych tedy poradit jak na to.

Přikládám zdrojový kod mé aplikace, předem varuji že pro zkušené programátory to bude paskvil, učím se elektromechaniku na učňáku, o programování mi ve škole nikdo neřekne ani slovo, mám takovej pocit že je to tam zapovězené téma, doma si jen tak ze zájmu programuju jádro 8051 a AVR.

O objektově orientovaném programování nevím zhola nic, prosím nereagujte komentářema typu "tak se to nejdřív nauč pak až teprva programuj" na učení nemám čas potřebuju to mít do konce listopadu hotové :D. Předem děkuji za jakoukoliv radu či pomoc :)

#*-* coding: utf-8 *-*
import wx
import serial

ser = serial.Serial(13, 9600)
    
class Main(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(500, 400))

        panel = wx.Panel(self, -1)
        panel.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)
        panel.Bind(wx.EVT_KEY_UP, self.OnKeyUp)
        panel.SetFocus()

        menubar = wx.MenuBar()
        file = wx.Menu()
        file.Append(-1, 'Quit', 'Quit application')
        menubar.Append(file, '&File')
        self.SetMenuBar(menubar)
        self.Bind(wx.EVT_MENU, self.OnQuit)

                
        self.Centre()
        self.Show(True)
  
    
    def OnKeyDown(self, event):
        keycode = event.GetKeyCode()

        if keycode == 87:  #W
            ser.write(1)
        if keycode == 83:  #S
            ser.write(2)
        if keycode == 65:  #A
            ser.write(3)
        if keycode == 68:  #D
            ser.write(4)
        if keycode == 81:  #Q
            ser.write(6)
        if keycode == 69:  #E
            ser.write(7)
        if keycode == 70:  #F
            ser.write(8)
        if keycode == 82:  #R
            ser.write(9)    
        if keycode == wx.WXK_ESCAPE:
            ret  = wx.MessageBox(u'Opravdu chceš ukončit program?', 'Question', wx.YES_NO | wx.NO_DEFAULT, self)
            if ret == wx.YES:
                ser.close()
                self.Close()


    def OnKeyUp(self, event):
        keycode = event.GetKeyCode()
        
        if keycode == 89 or 83 or 68 or 65:
            ser.write(5)
        
    def OnQuit(self, event):
        ret  = wx.MessageBox(u'Opravdu chceš ukončit program?', 'Question', wx.YES_NO | wx.NO_DEFAULT, self)
        if ret == wx.YES:
            ser.close()
            self.Close()

app = wx.App()
Main(None, -1, "Lenka")
app.MainLoop()
Nahlásit jako SPAM
IP: 109.80.106.–
liborb
~ Redaktor
+18
Guru
5. 11. 2012   #2
-
0
-

Nejprve bych si zvolil nějaký protokol, kterým se bude komunikovat. Na tyto účely je jich hodně již vymyšlených, ale klidně můžeš vymyslet vlastní kolo. Osobně bych použil Epsnet, ale Modbus pro tebe bude asi jednodušší.

Je to na jednoduchém principu, kdy si definuješ vlastní prostor, který chceš komunikovat. Některé registry budou pro zápis, tj. ty, kterými budeš Lenku ovládat. A další budou pro čtení, tj. ty, kterými ti bude Lenka dávat tebou požadované informace. Tenhle formální popis, který na první pohled vypadá, že ti to jenom komplikuje, ti následně usnadní život. Jednak na to existuje plno zkušebních utilitek a dále, když budeš hledat, tak najdeš i použitelné implementace protokolu a třeba nebudeš ani muset nic (nebo alespoň ne tolik) programovat ;).

Nahlásit jako SPAM
IP: 188.75.135.–
5. 11. 2012   #3
-
0
-

No, vypadá to zajímavě, zkusím se po tom podívat, ovšem bojím se že naučení s tím bude vyžadovat více času než mám k dispozici. A taky budou pak potřeba nejspíše ještě zásahy do programu Lenky, to je trochu nemilé, chtěl jsem ji zachovat jednoduchost :)

Nahlásit jako SPAM
IP: 109.80.106.–
6. 11. 2012   #4
-
0
-

Na ten Modbus jsem koukal, a opravdu mi to přijde složité pro můj případ. Spíš opravdu potřebuji jenom poradit s tím jak do tohoto dostat novou smyčku, vlákno nebo prostě něco co neustále či jednou za čas (200ms třeba) bude sledovat seriový port a když na něm budou data tak je zpracuje, při zachování grafického rozhraní. Protokol měnit nemá cenu, stačí tenhle sranda protokol který jsem si vymyslel :) neboli posílání různých znaků po tom sériovém portu s přiřazeným významem.

Nerad bych předělával celý program pro Lenku (teď myslím jenom tu část v mikroprocesoru) protože k tomu budu ještě nejspíše dodělávat ovládání dálkovým ovladačem od televize, a rameno s kamerou. Plány mám velké, času málo :D

Nahlásit jako SPAM
IP: 109.80.106.–
liborb
~ Redaktor
+18
Guru
7. 11. 2012   #5
-
0
-

Škoda :). Existují takové malé panelky (třeba zde), co Modbus nebo jiné protokoly umí, takže pak by si to mohl řídit "z čehokoliv".

Pokud chceš jednou za čas číst data z portu, tak použij třeba timer. Osobně bych ti ovšem alespoň doporučoval zachovat princip dotaz-odpověď, tj. aby Lenka posílala ty data jen na nějaký sranda dotaz.

Nahlásit jako SPAM
IP: 188.75.135.–
7. 11. 2012   #6
-
0
-

Nad tím timerem jsem trošku uvažoval, snažil jsem se ho zrealizovat ovšem moc se mi to nedařilo, zkusím to s ním znovu.

Nahlásit jako SPAM
IP: 109.80.106.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 14 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý