Categorie: School Projecten

PIC bestuurde robotwagen Update

De code is ondertussen klaar.

De code in de robotauto:

    Device              16F628A
    Config WDT_OFF, PWRTE_Off, LVP_OFF, MCLRE_on, INTRC_OSC_NOCLKOUT
    ALL_DIGITAL         TRUE 
    PORTB_PULLUPS       = 1
'Declaraties    
    'Sensoren
    Symbol sensorR      = PORTA.6
    Symbol sensorL      = PORTA.7
    'Motoren
    Symbol motorvooruit = PORTA.2
    Symbol motorachteruit  = PORTA.3
    Symbol stuurLinks   = PORTA.1
    Symbol stuurRechts  = PORTA.0
    'Terugkoppeling stuur
    Symbol stuursensL   = PORTB.0
    Symbol stuursensM   = PORTB.1
    Symbol stuursensR   = PORTB.2
    'Leds
    Symbol led1         = PORTB.3
    Symbol led2         = PORTB.4
    Symbol led3         = PORTB.5
    Symbol led4         = PORTB.6
    Symbol led5         = PORTB.7
    

'Wachten voor dat er bogonnen wordt 
'(De sensoren hebben tijd nodig om op te starten)    
    DelayMS 1000
    
'Stuur initialiseren
    'Staat het stuur in het midden?
    If stuursensM = 0 Then
        GoTo klaarinit      'Direct naar klaarinit gaan
    EndIf
    'Staat het stuur links?
    If stuursensL = 0 Then 
        GoTo links         'Naar links gaan
    EndIf
    'Staat het stuur rechts?
    If stuursensR = 0 Then
        GoTo rechts        'Naar rechts gaan
    EndIf
    'In geen stand (geen terugkoppeling)
    'Eerst volledig naar rechts draaien
    High    stuurRechts
    While   stuursensR = 1 
        ;Lusje totdat de stuursensor rechts laag wordt
    Wend
    Low     stuurRechts
    DelayMS 500 
    'Naar gedeelte gaan voor als het stuur naar rechst staat    
    GoTo    rechts      
    
rechts:
    'Naar links sturen    
    High    stuurLinks
    While   stuursensM = 1 
        ;Lusje totdat de stuursensor midden laag wordt
    Wend
    Low     stuurLinks
    DelayMS 500
    GoTo    klaarinit
    
links:
    ;Naar rechts sturen
    High    stuurLinks
    While   stuursensM = 1
        ;Lusje totdat de stuursensor midden laag wordt
    Wend
    Low     stuurLinks
    DelayMS 500

klaarinit:        
    High motorvooruit
    Low  motorachteruit
    High led3
    GoTo main
    

'Hoofdprogramma
main:   
    ;links opstakel
    If sensorL = 0 Then
        DelayMS 10
        High    led1
        GoSub   linksDect
    EndIf
    Low led1 
    ;rechts opstakel
    If sensorR = 0 Then
        DelayMS 10
        High    led5
        GoSub   rechtsDect 
    EndIf
    Low led5  

GoTo main
            
rechtsDect:  
    High led4  
    ;stukje achteruit
    Low     motorvooruit
    DelayMS 10
    High    motorachteruit
    DelayMS 1000
    Low  motorachteruit
    Low     led4
    ;Draaien
    High    stuurLinks    
    While stuursensL = 1
        ;Lusje totdat de stuursensor links laag wordt
    Wend
    Low     stuurLinks   
    ;Stukje vooruit
    DelayMS 10
    High    motorvooruit
    DelayMS 1000
    Low     motorvooruit
    ;Stuur  terug recht zetten
    High    stuurRechts
    While   stuursensM = 1
        ;Lusje totdat de stuursensor midden laag wordt
    Wend
    Low     stuurRechts
    DelayMS 10
    High    motorvooruit

Return

linksDect:
    High  led2
    ;stukje achteruit
    Low     motorvooruit
    DelayMS 10
    High    motorachteruit
    DelayMS 1000
    Low  motorachteruit
    Low     led2
    ;Draaien
    High    stuurRechts    
    While stuursensR = 1
        ;Lusje totdat de stuursensor links laag wordt
    Wend
    Low     stuurRechts
    ;Stukje vooruit
    DelayMS 10
    High    motorvooruit
    DelayMS 1000
    Low     motorvooruit
    ;Stuur  terug recht zetten
    High    stuurLinks
    While   stuursensM = 1
        ;Lusje totdat de stuursensor midden laag wordt
    Wend
    Low     stuurLinks
    DelayMS 10
    High    motorvooruit

Return

;bij fout
GoTo main
End

 

De code in de tank:

Device 16F628A
Config WDT_OFF,PWRTE_OFF,LVP_OFF,MCLRE_ON,INTRC_OSC_NOCLKOUT, BODEN_OFF

ALL_DIGITAL true 

Symbol      motorLinksV = PORTA.2
Symbol      motorLinksA = PORTA.3
Symbol      motorRechtsV = PORTA.6

Symbol      motorRechtsA = PORTA.7

Symbol      sensorL = PORTA.0
Symbol      sensorR = PORTA.1

Symbol      led1 = PORTB.0
Symbol      led2 = PORTB.1

Symbol      led3 = PORTB.2
Symbol      led4 = PORTB.3
Symbol      led5 = PORTB.4 

Clear 

High motorLinksV
DelayMS 10
High motorRechtsV

Low motorRechtsA
Low motorLinksA

main:
If sensorL = 0 Then
            'hoog maken van led1
            High led1
            'stoppen van motoren vooruit
            Low motorLinksV
            Low motorRechtsV
            '100ms wachten
            DelayMS 100
            'achteruit rijden
            High motorLinksA
            DelayMS 10
            High motorRechtsA
            'hoogmaken van led3 en Led4
            High led3
            High led4
            '1 s wachten
            DelayMS 1000
            'stoppen met rijden 
            Low motorLinksA
            Low motorRechtsA
            Low motorLinksV
            Low motorRechtsV
            'laag maken van led3 en led4
            Low led3
            Low led4
            '100 ms wachten
            DelayMS 100
            'led2 hoogmaken
            High led2
            'draaien van tank
            High motorLinksV
            DelayMS 10
            High motorRechtsA
            '500ms draaien
            DelayMS 500
            'laagmaken led2            
            Low led2
            'stoppen met draaien
            Low motorLinksV
            Low motorRechtsA
            '10 ms stoppen
            DelayMS 10
            'terug vooruit rijden
            High motorLinksV
            DelayMS 10
            High motorRechtsV


Else
            'als sensor links niets detecteert gaat led1 niet branden
            Low led1
EndIf
If sensorR = 0 Then
            'hoog maken van led5
            High led5
            'stoppen van motoren vooruit
            Low motorLinksV
            Low motorRechtsV
            '100ms wachten
            DelayMS 100
            'achteruit rijden
            High motorLinksA
            DelayMS 10
            High motorRechtsA
            'hoogmaken van led3 en Led4
            High led3
            High led4
            '1 s wachten
            DelayMS 1000
            'stoppen met rijden 
            Low motorLinksA
            Low motorRechtsA
            Low motorLinksV
            Low motorRechtsV
            'laag maken van led3 en led4
            Low led3
            Low led4
            '100 ms wachten
            DelayMS 100
            'led2 hoogmaken
            High led2
            'draaien van tank
            High motorLinksA
            DelayMS 10
            High motorRechtsV
            '500ms draaien
            DelayMS 500
            'laagmaken led2            
            Low led2
            'stoppen met draaien
            Low motorLinksA
            Low motorRechtsV
            '10 ms stoppen
            DelayMS 10
            'terug vooruit rijden
            High motorLinksV
            DelayMS 10
            High motorRechtsV


Else
            'als sensor rechts niets detecteert gaat led5 niet branden
            Low led5
EndIf

GoTo main
End

Servo Positioning Unit

Aangezien ik in het derde jaar bachelor elektronica zit moet ik dit jaar een stage doen. Die stage heb ik bij de school waar ik het middelbaar gezeten heb gedaan. Ik heb deze stage samen met Rob gedaan. (Zelfde Rob als bij het pic bestuurde auto project).

Onze opdracht bestaat er uit om een Yamaha servodrive aan te sturen voor een robotarm samen
met het programmeren van twee transportbanden met geïntegreerde lift.

De robotarm moet een werkstuk uit een magazijn nemen. Daarna moet deze robotarm het
werkstuk op de bovenste transportband leggen. Dit werkstuk wordt dan via de lift getransporteerd
naar de onderste transportband. Op de onderste transportband wordt er dan een bewerking
uitgevoerd op het werkstuk. Hierna gaat het bewerkte werkstuk met de lift terug omhoog en wordt
deze terug opgenomen door de robotarm. Vervolgens wordt het bewerkte werkstuk ergens
gestockeerd. Het bewerken van het plaatje behoort echter niet tot onze opdracht.

Overzicht

Een filmpje van de handelingen van de robot zonder werkstuk. Het magazijn ontbreekt hier ook nog:

Enkele foto’s van onderdelen:

De robot arm wordt aangestuurd door een servo drive van Yamaha type QRCX-E.

Servo drive

De servo drive en de rest van de robot wordt aangestuurd door een S7-313C.

PLC

De bek van de robotarm:

bek

Meer foto’s kan je hier vinden: Link.

Het boekje dat we hiervoor geschreven hebben: Link.

 

Servo Positioning Unit Update

Het veiligheidshek is ondertussen ook afgemaakt. Enkele foto’s:

spuspu

 

Filmpje van de robot in werking:

HexAvoider

Dit is een projectje dat ik een paar jaar geleden in school voor een projectweek samen met 2 klasgenoten heb gebouwd .

De plastic onderdelen en de printplaten (bouwkit) zijn aangekocht. Onze opdracht was de printplaten solderen en het programma schrijven.

In normale werking loopt de hexavoider rechtdoor. Dit gebeurt door de linkse kant omhoog te halen. Rechts wordt dan naar voor gedaan en links wordt naar achter gedaan. Dan wordt de andere kant omhoog gedaan. Links wordt dan naar voor gedaan en rechts naar achter. Zo stapt hij vooruit.
De HexAvioder heeft 2 soorten detectoren: de voelsprieten en de IR sensoren. Als de voelsprieten worden bediend gaat deze eerst achteruit en vervolgens draait hij naar de andere kant als van waar hij detecteerde. Hetzelfde is als de IR-sensoren iets detecteren. Eerst achteruit en dan draaien, dit is wel in een vaste richting aangezien we maar 1 IR-ontvanger hebben.

Filmpje van de HexAvoider in actie:

Code (Bascom):

'*************************************************
'* HexAvoider                                    *
'* Stijn Coenen, Rob Thomas, Stijn van Roy       *
'* 3ELO2                                         *
'*************************************************
$regfile = "89C51RC.dat"

'Kristal = 11Mhz
$crystal = 11059200
'*************************************************
'In en uitgangen aanduiden
Config Servos = 3 , Servo1 = P1.5 , Servo2 = P1.6 , Servo3 = P1.7 , Reload = 100

Led1 Alias P0.0
Led2 Alias P0.1
Led3 Alias P0.2
Led4 Alias P0.3
Buzzer Alias P0.5
Switch1 Alias P0.4
Switch2 Alias P0.5
Links_antenne Alias P3.2
Recht_antenne Alias P3.3
Led_antenne Alias T0
Irled_left Alias P1.0
Irled_right Alias P1.1
Irin Alias P1.2
Led_left Alias P1.3
Led_right Alias P1.4

Dim index As Byte
'*************************************************
'Subroutines
  'Subroutines skippen bij opstarten programma
  GoTo Oversub
  '*************************************************
  'Ir leds laten knipperen
  Ir_led_sturen:
     For index = 0 To 100
      Irled_left = 1
      Irled_right = 1
      delay
      Irled_left = 0
      Irled_right = 0
      Delay
     Next
  Return
  '*************************************************
  'Als er links gedetecteerd is
  Links_detect:
     Led1 = 0
     GoSub Servo_mid
     GoSub Achteruit
     GoSub Achteruit
     Waitms 2000
     GoSub Servo_mid
     GoSub Rechts_draai
     GoSub Rechts_draai
     Led1 = 1
  Return
  '*************************************************
  'Als er rechts gedetecteerd is
  Rechts_detect:
     Led2 = 0
     GoSub Servo_mid
     GoSub Achteruit
     GoSub Achteruit
     Waitms 2000
     GoSub Servo_mid
     GoSub Links_draai
     GoSub Links_draai
     Led2 = 1
  Return
  '*************************************************
  'Alle servo's in de middenstand zetten
  Servo_mid:
     Servo1 = 12
     Servo2 = 12
     Servo3 = 12
  Return
  '*************************************************  'Achteruit lopen
  Achteruit:
     'links omhoog
     Servo2 = 16
     Waitms 350
     'links naar achter
     Servo3 = 8
     Waitms 350
     'links naar voor
     Servo1 = 8
     Waitms 350
     ' rechts omhoog
     Servo2 = 8
     Waitms 350
     'rechts naar achter
     Servo1 = 16
     Waitms 350
     'links naar voor
     Servo3 = 16
     Waitms 350
  Return
  '*************************************************
  'Naar rechts draaien
  Rechts_draai:
     'links omhoog
     Servo2 = 16
     Waitms 350
     'links naar voor
     Servo3 = 14
     Waitms 350
     'rechts naar voor
     Servo1 = 8
     Waitms 350
     'rechts omhoog
     Servo2 = 8
     Waitms 350
     'rechts naar achter
     Servo1 = 14
     Waitms 350
     'links naar achter
     Servo3 = 8
     Waitms 350
  Return
  '*************************************************
  'Naar links draaien
  Links_draai:
     'links omhoog
     Servo2 = 16
     Waitms 350
     'links naar achter
     Servo3 = 8
     Waitms 350
     'rechts naar voor
     Servo1 = 14
     Waitms 350
      'rechts omhoog
     Servo2 = 8
     Waitms 350
     'rechts naar voor
     Servo1 = 8
     Waitms 350
     'links naar voor
     Servo3 = 14
     Waitms 350
  Return
  '*************************************************
  'Sensoren checken
  Sensor_check:
      'Linkse antenne
      If Links_antenne = 0 Then
         GoSub Links_detect
      End If
      'Rechtse antenne
      If Recht_antenne = 0 Then
         GoSub Rechts_detect
      End If
      'IR-Leds
      GoSub Ir_led_sturen
      If Irin = 0 Then
         GoSub Rechts_detect
      End If
  Return
Oversub:
'*************************************************
   'Servo's in de middenstand zetten
   GoSub Servo_mid
Do
   'rechts omhoog
   Servo2 = 8
      Waitms 350
      If Links_antenne = 0 Then
         GoSub Links_detect
      End If
      If Recht_antenne = 0 Then
         GoSub Rechts_detect
      End If
      GoSub Ir_led_sturen
      If Irin = 0 Then
         GoSub Rechts_detect
      End If
   'Links naar achter
   Servo3 = 10
     Waitms 350
     If Links_antenne = 0 Then
        GoSub Links_detect
     End If
     If Recht_antenne = 0 Then
        GoSub Rechts_detect
     End If
      GoSub Ir_led_sturen
     If Irin = 0 Then
        GoSub Rechts_detect
     End If
   'Rechts voor
   Servo1 = 8
      Waitms 350
      If Links_antenne = 0 Then
         GoSub Links_detect
      End If
      If Recht_antenne = 0 Then
         GoSub Rechts_detect
      End If
      GoSub Ir_led_sturen
      If Irin = 0 Then
         GoSub Rechts_detect
      End If
   'links omhoog
   Servo2 = 16
      Waitms 350
      If Links_antenne = 0 Then
         GoSub Links_detect
      End If
      If Recht_antenne = 0 Then
         GoSub Rechts_detect
      End If
      GoSub Ir_led_sturen
      If Irin = 0 Then
         GoSub Rechts_detect
      End If
   'rechts naar achter
   Servo1 = 15
      Waitms 350
      If Links_antenne = 0 Then
         GoSub Links_detect
      End If
      If Recht_antenne = 0 Then
         GoSub Rechts_detect
      End If
      GoSub Ir_led_sturen
      If Irin = 0 Then
         GoSub Rechts_detect
      End If
   'Links Naar Voor
   Servo3 = 14
      Waitms 350
      If Links_antenne = 0 Then
         GoSub Links_detect
      End If
      If Recht_antenne = 0 Then
         GoSub Rechts_detect
      End If
      GoSub Ir_led_sturen
      If Irin = 0 Then
         GoSub Rechts_detect
      End If
Loop
'*************************************************
End

Bestanden:

Code: Download

Cruiser Micromouse

Dit is een projectje dat ik een paar jaar geleden in school voor een projectweek samen met 2 klasgenoten heb gebouwd .

Het chassis en de printen van de cruiser micromouse zijn aangekocht, het programma hebben we zelf geschreven. De functie van dit robotje is een doolhof doorlopen.

 

Om de auto’s te testen hebben we een circuit gemaakt. Dit is zo gemaakt dat aan de ene zijde een doolhof is en aan de andere kant een lijn voor de lijnvolger.

 

Filmpje van de cruiser in actie:

Code (Bascom):

'*************************************************
'* Cruiser micromouse                            *
'* Stijn Coenen, Rob Thomas, Stijn van Roy       *
'* 3ELO2                                         *
'*************************************************
$regfile = "m8def.dat"
'Aangeven dat het intern kristal 
'op 8MHz is ingesteld
$crystal = 8000000
'**********************************
'In en uitgangen instellen
Config Portd.0 = Output
Config Portd.1 = Output
Config Portd.2 = Output
Config Portd.3 = Input
Config Portd.4 = Input
Config Portd.5 = Output
Config Portd.6 = Output
Config Portd.7 = Output
Config Portc.6 = Input
Config PORTB = Output
'**********************************
'In en uitgangen declareren
Led0 Alias Portd.0
Led1 Alias Portd.1
Led2 Alias Portd.2
Selectt Alias Portd.3
Modee Alias Portd.4
Sensor0 Alias Portd.5
Sensor1 Alias Portd.6
Sensor2 Alias Portd.7
Resett Alias Portc.6
Motor_en Alias PORTB.0
L_motor Alias PORTB.1
R_motor Alias PORTB.2
Led3 Alias PORTB.3
Led4 Alias PORTB.4
Led5 Alias PORTB.5
Buzzer Alias PORTB.6
'**********************************
'Byte's declareren
Dim Temp_register As Long
Dim Rechts_achter As Bit
Dim Rechts As Bit
Dim Rechts_voor As Bit
Dim Links_voor As Bit
Dim Links As Bit
Dim Links_achter As Bit
Dim I As Byte
Dim Led_bit As Bit
Dim Vanvoor As Bit
Dim Motorwaarde As Byte
Dim Muurbit As Bit
Dim Teller As Byte
'***********************************
'Analoge ingang instellen
Config Adc = Single , Prescaler = Auto
Start Adc
'***********************************
'Timer0 instellen (Voor de IR leds aan te sturen)
Config Timer0 = Timer , Prescale = 64 , Reference = External
'Prescaled kloksnelheid: 8000000 / 64 = 125 Khz
  'Waarde die in timer0 wordt gezet bij een     
  overflow
  Const Preload = 248
  '************************************
  'Interrupt's aanzetten
  Enable Interrupts
  Enable Timer0
  On Timer0 Interupt_label
  '************************************
  'Subroutines
    'Subroutines skippen bij opstarten programma
     GoTo Overint
     Interupt_label:
      'IR leds van de sensoren aansturen
      If Led_bit = 0 Then
         Sensor0 = 1
         Sensor1 = 1
         Sensor2 = 1
         Led_bit = 1
      Else
         Sensor0 = 0
         Sensor1 = 0
         Sensor2 = 0
         Led_bit = 0
      End If
      'De preload waarde terug in Timer0 zetten
      Timer0 = Preload
      'Motor PWM
      Incr Motorwaarde
      If Motorwaarde < 32 Then
         Motor_en = 1
      Else
         Motor_en = 0
         If Motorwaarde = 64 Then
            Motorwaarde = 0
         End If
      End If
   Return
   '*******************************************
   Buzzer_aanst:
      For I = 0 To 100
         Buzzer = 1
         Waitus 100
         Buzzer = 0
         Waitms 1
      Next
   Return
   '**********************************************
   'Analoge ingangen inlezen en omzetten naar bits
   Analoog_in:
      Start Adc
      Temp_register = Getadc(5)
      If Temp_register > 40 Then
         Rechts_achter = 1
         Led5 = 0
      Else
         Rechts_achter = 0
         Led5 = 1
      End If
      Temp_register = Getadc(4)
         If Temp_register > 60 Then
         Rechts = 1
         Led4 =  
      Else
         Rechts = 0
         Led4 = 1
      End If
      Temp_register = Getadc(3)
      If Temp_register > 60 Then
         Rechts_voor = 1
         Led3 = 0
      Else
         Rechts_voor = 0
         Led3 = 1
      End If
      Temp_register = Getadc(2)
      If Temp_register > 60 Then
         Links_voor = 1
         Led2 = 0
      Else
         Links_voor = 0
         Led2 = 1
      End If
      Temp_register = Getadc(1)
      If Temp_register > 40 Then
         Links = 1
         Led1 = 0
      Else
         Links = 0
         Led1 = 1
      End If
      Temp_register = Getadc(0)
      If Temp_register > 40 Then
         Links_achter = 1
         Led0 = 0
      Else
         Links_achter = 0
         Led0 = 1
      End If
   Return
'**************************************
Overint:
'Motors opzetten
L_motor = 1
R_motor = 1
Do
     GoSub Analoog_in
     If Links = 1 Then
         R_motor = 0
         L_motor = 1
         'Rechts draaien tot dat links niks 
 'meer gedetecteerd wordt
         Do
            GoSub Analoog_in
         Loop Until Links = 0
         L_motor = 1
         R_motor = 1
         Teller = 0
     ElseIf Rechts = 1 Then
         R_motor = 1
         L_motor = 0
         'Links draaien tot dat rechts niks 
 'meer gedetecteerd wordt
         Do
            GoSub Analoog_in
         Loop Until Rechts = 0
         L_motor = 1
         R_motor = 1
         Teller = 0
      ElseIf Links_voor = 1 Then
         R_motor = 0
         L_motor = 1
         Waitms 260
         'Links draaien tot dat vanvoor niks 
 'meer gedetecteerd wordt
         Do
            GoSub Analoog_in
         Loop Until Links_voor = 0
         L_motor = 1
         R_motor = 1
         Teller = 0
      End If
      'Als het programma 30 keer doorlopen is 
      'zonder dat er iets gedetecteerd is
      'dan kort naar links draaien
      Incr Teller
      If Teller = 30 Then
         Waitms 20
         R_motor = 1
         L_motor = 0
         Waitms 30
         L_motor = 1
         R_motor = 1
         Waitms 10
         Teller = 0
      End If
Loop
'******************************************
End

Bestanden:

Code: Download

 

Lijnvolger

Dit is een projectje dat ik een paar jaar geleden in school voor een projectweek samen met 2 klasgenoten heb gebouwd .

Nadat we de Cruiser Micromouse hadden gemaakt hadden we een sensor printje voor een lijnvolger over. De school had nog een chassis voor een zelfde robotje dus hebben we beslist om ook maar een lijnvolger te maken. De aansturingsprint hebben we zelf ontworpen, deze keer op basis van een PIC16F876A.

 

De lijnvolger moet de lijn volgen. Dit gebeurt doordat de sensoren, die voor op de robot zitten, infrarood licht uitzenden naar de ondergrond. Het infrarode licht wordt gereflecteerd door de ondergrond en wordt opgevangen door fototransistoren. Die zijn aangesloten op de analoge ingangen van de PIC. Als de waarde van die ingangen kleiner is dan een ingestelde waarde dan is de ondergrond wit. Als er links of rechts gedetecteerd wordt dan gaat de robot bijsturen. De buitenste sensoren worden niet gebruikt omdat hier nooit wordt gedetecteerd.
Op het zelfgemaakt printje zitten 4 groene ledjes: Led 1 is de power led, led 2 gaat aan als er naar rechts gedraaid wordt, led 3 bij vooruit rijden en led 4 bij links draaien.

 

Schema main print:

Schema sensor print:

Filmpje van de lijnvolger in actie:

 

Code (Picbasic):

'*************************************************
'*Naam   : Lijnvolger                            *           
'*Auteurs: Coenen Stijn, Thomas Rob,van Roy Stijn*
'*Datum  : 18/02/2009                            *             
'*************************************************
Device 16F876A
Config      WDT_OFF, PWRTE_ON, HS_OSC, lvp_off
XTAL        = 20

Declare ADIN_RES 10       ' 10-bit result required 
Declare ADIN_TAD FRC      ' RC OSC chosen 
Declare ADIN_STIME 50     ' Allow 50us sample time 

Dim sensor_waarde As Word

Dim detect_links2 As Bit
Dim detect_links1 As Bit
Dim detect_midden As Bit
Dim detect_rechts1 As Bit
Dim detect_rechts2 As Bit


ADCON1 = %10000010
'
Symbol sensorRU = PORTA.0
Symbol sensorRB = PORTA.1
Symbol sensorM = PORTA.2
Symbol sensorLB = PORTA.3
Symbol sensorLU = PORTA.5
TRISA=1
'
Symbol IR_led1 =PORTB.2
Symbol IR_led2 =PORTB.3
Symbol IR_led3 =PORTB.4
Symbol led4 = PORTB.5
Symbol led3 = PORTB.6
Symbol led2 = PORTB.7
TRISB = 0
'
Symbol motor1A = PORTC.7
Symbol motor1B = PORTC.6
Symbol motor2A = PORTC.5
Symbol motor2B = PORTC.4
TRISC=0
'
Symbol motor_en = PORTC.2
'
Clear
'
HPWM 1,190,1221 
motor1A = 0
motor1B = 0
motor2A = 0
motor2B = 0         
DelayMS 3000
  '**********************************************  
  'afstemmen van IRled's en sensoren.
  'Kijken welke led er wanneer 1 is.
  GoTo over_sub
    sensorinl:
        '*************************************
        '* L2 **** L1 * L0 * R0 * R1 **** R2 *
        '*************************************
        '  A4      A3     A2      A1      A0
        '  15      15     30      20      70
        sensor_waarde = ADIn 0
        If sensor_waarde < 70 Then
            detect_links2 = 1    
        Else
            detect_links2 = 0
        EndIf
        sensor_waarde = ADIn 1
        If sensor_waarde < 15 Then
            detect_links1 = 1 
        Else
            detect_links1 = 0       
        EndIf
        sensor_waarde = ADIn 2
        If sensor_waarde < 30 Then
            detect_midden = 1
        Else
            detect_midden = 0 
        EndIf   
        sensor_waarde = ADIn 3
        If sensor_waarde < 15 Then
            detect_rechts1 = 1    
        Else
            detect_rechts1 = 0
        EndIf
        sensor_waarde = ADIn 4
        If sensor_waarde < 15 Then
            detect_rechts2 = 1 
        Else
            detect_rechts2 = 0       
        EndIf

    Return
  '**********************************************      
  'Vooruit gaan    
    vooruit:
        motor1A = 0
        motor1B = 1
        motor2A = 1
        motor2B = 0 
        led2 = 0
        led3 = 1
        led4 = 0  
    Return
  '**********************************************     
  'een stuk naar links draaien    
    Links_draaien_weinig:
        motor1A = 0
        motor1B = 0
        motor2A = 1
        motor2B = 0
        led2 = 0
        led3 = 0
        led4 = 1
        DelayMS 5
        GoSub vooruit                  
    Return
   '**********************************************     
   'een stuk naar links draaien     
    Rechts_draaien_weinig:
        motor1A = 0
        motor1B = 1
        motor2A = 0
        motor2B = 0
        led2 = 1
        led3 = 0
        led4 = 0
        DelayMS 5
        GoSub vooruit                  
    Return
'**********************************************      
'een stuk naar links draaien   (langere delay)   
    Links_draaien_veel:
        motor1A = 0
        motor1B = 0
        motor2A = 1
        motor2B = 0
        led2 = 0
        led3 = 0
        led4 = 1
        DelayMS 100
        GoSub vooruit                  
    Return
'**********************************************    
'een stuk naar rechts draaien (langere delay)     
    Rechts_draaien_veel:
        motor1A = 0
        motor1B = 1
        motor2A = 0
        motor2B = 0
        led2 = 1
        led3 = 0
        led4 = 0
        DelayMS 100
        GoSub vooruit                  
    Return
'**********************************************   
'alle sensoren op 1 zette
over_sub:
   IR_led1 = 0
   IR_led2 = 0
   IR_led3 = 0
   GoSub vooruit
'**********************************************      
'oneindige lus  
While 1=1
    Main:
'**********************************************      
'kijken welke sensor(en) er 1 is/zijn
    GoSub sensorinl
    If detect_links1 = 1 Then
        GoSub Rechts_draaien_weinig
        GoTo Main
    EndIf       
    If detect_rechts1 = 1 Then
        GoSub Links_draaien_weinig
        GoTo Main
    EndIf     
'**********************************************   
Wend
End


Bestanden:

Code: Download

 

PCB bestanden: Download


3*3*3 LED Cube

Dit is een projectje dat ik een paar jaar geleden in school voor een projectweek samen met 2 klasgenoten heb gebouwd .

We hadden nog wat tijd over tijdens de projectweek dus hadden we beslist een led cubus te bouwen.

De gebruikte microcontroller is 16F648A. De leds staan in een matrix. Ze worden horizontaal en verticaal gestuurd. Hierdoor kunnen ze apart worden aangestuurd en kan je verschillende figuren maken.

Het aansturen van ledjes gebeurt op volgende manier: eerste wordt de transistor van de eerste rij aangestuurd (wordt aan de massa gelegd). Hierna worden de leds van deze rij aangestuurd door het aansturen van de niveaus. Hierna wordt de transistor van de eerste rij weer laag en het tweede rij wordt dan aangestuurd enz… .
Zo kun je de leds elk apart aansturen.

 

 

Schema:

 

Filmpje van de LED cube in actie:

 

Bestanden:

Code: Download