FreeBASIC programiranje, pitanja i odgovori

poruka: 47
|
čitano: 18.751
|
moderatori: Lazarus Long, XXX-Man, vincimus
+/- sve poruke
ravni prikaz
starije poruke gore
12 godina
neaktivan
offline
FreeBASIC programiranje, pitanja i odgovori

Kako se postavlja uvijet koji gleda dal je neki broj paran ili neparan? Dal je dovoljno napisati "if a/2"?

 

 

Edit - zanemarite ovo, sjetila sam se :)

 

If a Mod 2=0

Poruka je uređivana zadnji put ned 2.12.2012 21:15 (AlexaGB).
 
0 0 hvala 0
17 godina
neaktivan
offline
FreeBASIC programiranje, pitanja i odgovori

Imam pitanje, vezano za programiranje Emoro mobilnog robota u FreeBASIC-u.

 

Trebam napisati program koji bi pokretao motor PWM_1 i istovremeno provjeravao udaljenost robota od prepreke i ovisno o tome zaustavio motore SERVO_1 i SERVO_2.

 

Bitno je napomenuti da su to dvije odvojene i nezavisne radnje, zato ih ne bih stavljao u jednu petlju, već dva odvojena bloka (ili modula,subrutine,petlje ili nešto tog tipa).

 

Ovo je trenutni program, problem je što se izvršava samo 1. petlja koja pokreće PWM_1, pa program uopće ne dolazi u petlju  koja pokreće SERVO_1 i SERVO_2 i provjerava udaljenost.

 

 

#Include once "emoro.bi"          
#Include "fbgfx.bi"
EmoroAutoConnect()

InitServo(SERVO_1)                  ' Pokreni servo SERVO_1                    
InitServo(SERVO_2)                  ' Pokreni servo SERVO_2                    
InitAdc(DS1)
InitServo(PWM_1)
  
  
do
SetServo(PWM_1, 1500)
SLEEP 1000
DIM ZBROJ AS SINGLE
For i as single = 0 To 500 Step 100
ZBROJ =1500+i
PRINT ZBROJ
SetServo(PWM_1, 1500+i)
SLEEP 1000
Next i
SLEEP 1000

For i as single = 500 To -500 Step -100
ZBROJ =1500+i
PRINT ZBROJ
SetServo(PWM_1, 1500+i)
SLEEP 1000
Next i
SLEEP 1000
SetServo(PWM_1, 1500)
loop

  
 Dim distance As Unsigned Integer
 
    SetServo(SERVO_1,1500)          
    SetServo(SERVO_2,1500)
    Sleep 1000
   
   DO
        distance = GetAdc(DS1)
      print distance
  SetServo(SERVO_1, 2000)              
    SetServo(SERVO_2, 1000)    
loop while Input1() = 0 and Input2() = 0 and distance<200
while Input1() = 1  or Input2() = 1 or distance >=200
     SetServo(SERVO_1, 1500)              
    SetServo(SERVO_2, 1500)
wend                                            
   
                 
   
 

 

 

 

 
0 0 hvala 0
17 godina
neaktivan
offline
FreeBASIC programiranje, pitanja i odgovori

Najbolje je napraviti novi thread koji će se pokretati paralelno sa ostatkom programa (thread-ovi ne rade u DOS-u):

 

#Include once "emoro.bi"      

#Include "fbgfx.bi"

EmoroAutoConnect() 

 

InitServo(SERVO_1)  ' Pokreni servo SERVO_1           

InitServo(SERVO_2)  ' Pokreni servo SERVO_2           

InitAdc(DS1) 

InitServo(PWM_1) 

 

' Globalna varijabla distance:

Dim Shared distance As UInteger

 

' Novi thread koji se pokreće paralelno s ostalim radnjama:

Sub DistanceThread(empty As Integer)

  SetServo(SERVO_1,1500)      

  SetServo(SERVO_2,1500)

  Sleep 1000 

 

  Do 

   distance = GetAdc(DS1) 

   Print distance

   SetServo(SERVO_1, 2000)        

   SetServo(SERVO_2, 1000)   

  Loop while Input1() = 0 and Input2() = 0 and distance<200

 

  While Input1() = 1  or Input2() = 1 or distance >=200

   SetServo(SERVO_1, 1500)        

   SetServo(SERVO_2, 1500)

  Wend

End Sub

 

' Ulaz u novi thread:

ThreadCreate(@DistanceThread, 0)

 

' Nakon ulaza u novi thread, program nastavlja paralelno raditi sa threadom:

Do

  SetServo(PWM_1, 1500)

  Sleep 1000

 

  Dim ZBROJ AS SINGLE

  For i as single = 0 To 500 Step 100

   ZBROJ =1500+i

   Print ZBROJ

   SetServo(PWM_1, 1500+i)

   Sleep 1000

  Next i

 

  Sleep 1000

 

  For i as single = 500 To -500 Step -100

   ZBROJ =1500+i

   Print ZBROJ

   SetServo(PWM_1, 1500+i)

   Sleep 1000

  Next i

 

  Sleep 1000

  SetServo(PWM_1, 1500)

Loop

0100001001101111011010100110000101101110
Moj PC  
0 0 hvala 1
17 godina
neaktivan
offline
FreeBASIC programiranje, pitanja i odgovori

Boky, hvala.

Sa tvojim kodom sve radi dobro, osim jedne stvari:

 

ne provjerava uvjet

 

Input1() = 1  or Input2() = 1 or distance >=200

 

nakon što prvi put završi petlju

 

 For i as single = 0 To 200 Step 100

   ZBROJ =1500+i

   Print ZBROJ

   SetServo(PWM_1, 1500+i)

   Sleep 1000

  Next i

 

nakon što izađe iz nje, u konzoli ispisuje

Command timeout: Input2 failed

 

Ne razumijem zašto???

 
0 0 hvala 0
17 godina
neaktivan
offline
Re: FreeBASIC programiranje, pitanja i odgovori

Vjerojatno je negdje problem u toj naredbi input2. Pošto je to dio tog include fajla "emoro.bi" onda ne znam na koji način to programiranje robota funkcionira.

0100001001101111011010100110000101101110
12 godina
neaktivan
offline
Usb

Zamolio bih za objašnjenje o korištenju USB-a za robotiku.

Do sada sam radio preko LPT-a i želio bih prijeći na USB port. Može li se to sa Free Basicom i kako?

 
0 0 hvala 0
15 godina
neaktivan
offline
Re: Usb
sxtef kaže...

Zamolio bih za objašnjenje o korištenju USB-a za robotiku.

Do sada sam radio preko LPT-a i želio bih prijeći na USB port. Može li se to sa Free Basicom i kako?

Svašta se može samo što je USB prilično kompliciran protokol (u usporedbi sa ovime što si do sada radio preko paralelnog porta). Ne očekuj trivijalno otvaranje porta i slanja nekakvih podataka kroz njega...

http://www.beyondlogic.org/usbnutshell/usb1.shtml

 

Upravo zato što su tako primitivni je razlog zašto je sa paralelnim i serijskim portom prilično lagano raditi.

0xBADC0DE
12 godina
neaktivan
offline
Re: Usb

Vrlo komplicirano. Znao sam da neće biti dovoljno nabaviti samo prijelazni kabel USB-LPT, ali ovo je beyondmymind.

Bio sam nabavio arduino sučelje uno, pa bih s time pokrenuo barem par LED-ica, no nigdje ne nalazim takav programic u FreeBASICU. Čak niti na toj stranici gdje su popisani mnogi jezici: http://playground.arduino.cc/Main/InterfacingWithSoftware, postoji i redak Arduino+FreeBASIC ali se otvara Error 404.

17 godina
neaktivan
offline
Re: Usb
ja koristim Bluetooth za spajanje na sučelje , ali u manualu također ima objašnjenje i o spajanju putem USB-a. pogledaj pa javi dali ti pomaže.

www.hdr.hr/files/E-MORO_Upute.pdf
12 godina
neaktivan
offline
Re: Usb

Izgleda da bih u tom slučaju treba prijeći na Inovatic sučelje.

 

17 godina
neaktivan
offline
Re: Usb
Čini mi se da ovdje nije problem u programskom jeziku već o povezivanju Arduino sučelja preko USB-a. Zar nema uputa o spajanju?
12 godina
neaktivan
offline
Re: Usb

 

Surfajući po tom pitanju, naišao sam na neke mogućnosti da bi se pomoću aplikacija za preusmjeravanje printanja sa paralelnog na USB port, a sve iz DOS-a (što odgovara za QBASIC) to moglo nekako uraditi, ali uz odredjene promjene na LPRINT, ...?

 

 

 

15 godina
neaktivan
offline
Re: Usb

Sa čime vi to zapravo imate problem? Sa komunikacijom sa USB uređajima? Ako da, onda možete koristiti LibUSB koji sam i ja svojevremeno koristio za čačkanje po svojem grafičkom tabletu.

Prvo skinuti standardni C paket (driver, alati, import biblioteka, primjeri)

U bin\ podfolderu se nalazi:

  • ia64 folder (driver za 64 bitne intel procesore)
  • amd64 folder (driver za 64 bitne amd procesore)
  • x86 folder (generički driver za 32 bitne operacijske sustave)


U tim folderima se nalaze slijedeće datoteke:

  • libusb0.sys - usb filter driver
  • libusb0.dll - dinamička biblioteka pomoću koje komunicirate sa driverom
  • install-filter-win.exe - program koji instalira/uninstalira filter driver iz driver stacka
  • testlibusb-win.exe - program kojim provjeravate je li sve instalirano kako treba i funkcionalno


Bitno: u x86 folderu biblioteka libusb0.dll se zapravo zove libusb0_x86.dll i potrebno ju je preimenovati u libusb0.dll ako kanite koristiti 32 bitni driver i dll interface

Nakon toga, trebate

  1.  kopirati import biblioteku libusb.a iz lib\gcc foldera u lib\win32 folder freebasic kompajlera
  2.  Odavde pokupiti lusb0_usb.bi include datoteku i kopirati ju u inc folder freebasic kompajlera

 

  • Pomoću install-filter-win.exe programa instalirate libusb0.sys filter driver u driver stack bilo kojeg usb uređaja i time možete nadzirati komunikaciju između operacijskog sustava i uređaja
  • Pomoću inf-wizard.exe alata se kreira .inf datoteka za usb uređaje koji nemaju nikakav driver, tada se libusb0.sys driver koristi kao funkcijski driver umjesto kao filter driver


Nakon što je driver instaliran (na bilo kao filter ili funkcijski driver) njegova funkcionalnost se može provjeriti programom testlibusb.exe koji će ispisati neke informacije o uređaju na kojem je driver aktivan.

Primjer ispravno instaliranog drivera:

 
Primjer neispravno instaliranog drivera:
 
I to je to, sustav je spreman za pisanje programa koji komuniciraju sa željenim usb uređajem. Nakon toga slijedi dosta proučavanja i učenja usb standarda kako bi skužili što i kako dalje :) U osnovi se sve svodi na traženje pravog uređaja u sistemu, otvaranje uređaja, odabira konfiguracije uređaja i onda čitanja i pisanja po endpointima, ali namjera ovog mog piskaranja nije poučavanje rada usb uređaja za to imate slijedeće linkove:

 

http://sourceforge.net/apps/trac/libusb-win32/wiki

http://sourceforge.net/apps/trac/libusb-win32/wiki/libusbwin32_documentation

 

http://www.beyondlogic.org/usbnutshell/usb1.shtml
http://www.usbmadesimple.co.uk/

 

Evo i primjer koda koji traži i vraća handle na prvi pronađeni uređaj sa određenim ID-em, i ispisuje neke osnovne informacije o uređaju (na brzinu konvertirano iz mog jednog C programčića, ispričavam se ako stil baš i nije najbolji za freebasic):

#Include once "lusb0_usb.bi"

usb_init()

Dim As usb_dev_handle Ptr device

Declare Sub print_device_info(dev As usb_device Ptr)

Sub find_device(ByRef dev As usb_dev_handle Ptr)
    Dim As usb_bus Ptr bus
    Dim As usb_device Ptr current_dev
   
    usb_find_busses()
    usb_find_devices()
   
    bus = usb_get_busses()
   
    While bus
       current_dev = bus->devices
      
       While current_dev
          If current_dev->descriptor.idVendor=&H7392 Then
             If current_dev->descriptor.idProduct=&H7711 Then
             ? "Found! Vendor = 0x" & hex(current_dev->descriptor.idVendor, 4) & " Product = 0x" & hex(current_dev->descriptor.idProduct, 4)
             ? " "
             dev = usb_open(current_dev)
             print_device_info(current_dev)
             Exit While, While
             EndIf
          EndIf
         
          current_dev = current_dev->Next
       Wend
      
       bus = bus->Next
    Wend
   
End Sub

Sub print_device_info(dev As usb_device Ptr)
    Dim string_buffer As ZString * 255
    Dim dev_handle As usb_dev_handle Ptr = usb_open(dev)
    Dim ret As Integer
   
    ret = usb_get_string_simple(dev_handle, dev->descriptor.iManufacturer, Cptr(Byte Ptr, @string_buffer), 255)
    ? string_buffer
    ret = usb_get_string_simple(dev_handle, dev->descriptor.iProduct, Cptr(Byte Ptr, @string_buffer), 255)
    ? string_buffer
    ret = usb_get_string_simple(dev_handle, dev->descriptor.iSerialNumber, Cptr(Byte Ptr, @string_buffer), 255)
    ? string_buffer
    ? " "
    usb_close(dev)
   
    ? "bLength            " & dev->descriptor.bLength
    ? "bDescriptor type   " & "0x" & Hex(dev->descriptor.bDescriptorType, 2)
    ? "bcdUSB             " & "0x" & Hex(dev->descriptor.bcdUSB, 4)
    ? "bDeviceClass       " & "0x" & Hex(dev->descriptor.bDeviceClass, 4)
    ? "bDeviceSubClass    " & "0x" & Hex(dev->descriptor.bDeviceSubClass, 2)
    ? "bDeviceProtocol    " & "0x" & Hex(dev->descriptor.bDeviceProtocol, 2)
    ? "bMaxPacketSize0    " & dev->descriptor.bMaxPacketSize0
    ? "idVendor           " & "0x" & Hex(dev->descriptor.idVendor, 4)
    ? "idProduct          " & "0x" & Hex(dev->descriptor.idProduct, 4)
    ? "bcdDevice          " & "0x" & Hex(dev->descriptor.bcdDevice, 4)
    ? "iManufacturer      " & dev->descriptor.iManufacturer
    ? "iProduct           " & dev->descriptor.iProduct
    ? "iSerialNumber      " & dev->descriptor.iSerialNumber
    ? "bNumConfigurations " & dev->descriptor.bNumConfigurations
    ? " "
End Sub

find_device(device)

If device = 0 Then
    End 1
EndIf

'usb_set_configuration(device, 1)

Sleep
End 0

 

What Andy giveth, Bill taketh away.
Poruka je uređivana zadnji put sri 31.7.2013 23:50 (rustweaver).
12 godina
neaktivan
offline
Re: Usb

Puno hvala na detaljnom odgovoru!

7 godina
neaktivan
offline
FreeBASIC programiranje, pitanja i odgovori

Treba mi pomoc. Skino sam FreeBasic i FBEditor. Sta dalje. Kada Otvorim Editor i napisem kod, kako pokrenuti da vidim reyultat koda?

 
0 0 hvala 0
7 godina
neaktivan
offline
Re: FreeBASIC programiranje, pitanja i odgovori

U redu je, radi sa FBIde. U FBEditoru nesto nije htelo.

8 godina
neaktivan
offline
Re: FreeBASIC programiranje, pitanja i odgovori

Ti programski jezici su zastarili, nauci C jezike, ili python

Trust nobody, become the best !
Nova poruka
E-mail:
Lozinka:
 
vrh stranice