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
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
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
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
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???
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.
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?
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.
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.
Izgleda da bih u tom slučaju treba prijeći na Inovatic sučelje.
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, ...?
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:
U tim folderima se nalaze slijedeće datoteke:
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
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:
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
Puno hvala na detaljnom odgovoru!
Treba mi pomoc. Skino sam FreeBasic i FBEditor. Sta dalje. Kada Otvorim Editor i napisem kod, kako pokrenuti da vidim reyultat koda?
U redu je, radi sa FBIde. U FBEditoru nesto nije htelo.
Ti programski jezici su zastarili, nauci C jezike, ili python