I wanted to try using V53L0X laser range finder but looked complicated.
I wanted to use 28byj-48 stepper motors but they need to be pulsed at 2ms for max torque/speed.
I sorted it for mega328. https://www.youtube.com/watch?v=Y_ai0tc_rek
Lots of code for your own projects like using V53L0X. using stepper motors driven by interrupt, using one interrupt for 2 events like running the motors and servo. Hope there's something useful.
;fullwave stepper V53L0X robot
#chipmega328p,16
#optionExplicitdirportc.0out;servodirportd.0out:dirportd.1out:dirportd.2out:dirportd.3out;left motordirportd.4out:dirportd.5out:dirportd.6out:dirportd.7out;right motor;set up V53L0X
#defineHI2C_DATAPORTC.5;sda portc.4 for nano portc.5 for uno
#defineHI2C_CLOCKPORTC.4;scl portc.5 for nano portc.4 for uno
#defineHI2C_BAUD_RATE400HI2CModeMaster;;v53l0x software restartHI2CStartHI2CSend(0x52)HI2CSend(0x89)HI2CSend(0x01)HI2CStopwait200ms;diml_mot_pos,r_mot_posasbytediml_mot_dir,r_mot_dirasbytedimservoposasWorddimservodir,distance_lo,distance_hi,mindist,last_turnasByte;
#definedistancedistance_hi*256+distance_lo;v53l0x distance
#defineforward1;|
#definereverse255;|--motor direction
#definestop0;|
#defineservopinportc.0
#definewasleft1
#definewasright0;last_turn=randomand1;0 or 1servopos=1500;1.5ms servo mid positionservodir=1;servo rotation directionmindist=200;minimum distance before avoidingl_mot_pos=1:r_mot_pos=1l_mot_dir=forward:r_mot_dir=forward;-----------;set up interruptsdimmillsasbyte : mills=0OnInterruptTimer0Match1CallisrDimOCR0ASbytealiasOCR0ADimTCCR0ASbytealiasTCCR0BWGM01=1OCR0=124;2msTCCR0=0x28TCCR0=TCCR0or0x04;-----------do;main program;check for objects and avoidgetdistance;any object too close?ifdistance<>20then;20 means out of range so skip distance test;;distance to obstacle testifservopos>1300then;not pointing rightifservopos<1700then;not pointing leftmindist=200;pointing forward min distanceendifelsemindist=250; left and right min distanceendif;ifdistance<mindistthen;object closel_mot_dir=stop:r_mot_dir=stop;stop motors;ifservopos>1700thenturnright_until_clear;object leftlast_turn=wasrightelseifservopos<1300thenturnleft_until_clear;object rightlast_turn=wasleftelse;obstacle forwardl_mot_dir=reverse : r_mot_dir=reverse : wait500ms;reverse 500msiflast_turn=wasrightthen;turn right againservodir=1turnright_until_clearelse;turn left againservodir=0turnleft_until_clearendifendifl_mot_dir=forward:r_mot_dir=forward;go forwardendifendif;;rotate servo left-rightifservodir=1thenservopos=servopos+80ifservopos=2220thenservodir=0endifelseservopos=servopos-80ifservopos=780thenservodir=1endifendif; pulseout servopin,servopos uswait30ms'to allow servo to move slower and not overheat and getdistance to workloop;end of main;-------------------subisrmotors;every 2msmills=mills+2ifmills=20thenmills=0 : servo;every 20msendsub;--------------------subgetdistanceHI2CStart;Sys V53L0X Range StartHI2CSend(0x52)HI2CSend(0x00)HI2CSend(0x01)HI2CStopHI2CStart;read distanceHI2CSend(0x52)HI2CSend(0x1e)HI2CReStartHI2CSend(0x53);set the read flagHI2CReceive(distance_hi)HI2CReceive(distance_lo, NACK);read one byte and concludeHI2CStopendsub;-------------------subturnleft_until_cleardol_mot_dir=reverse:r_mot_dir=forward;rotate anti clockwisewait20msl_mot_dir=stop:r_mot_dir=stopgetdistanceloopuntildistance>mindist;rotate left until clearendsub;-------------------subturnright_until_cleardol_mot_dir=forward:r_mot_dir=reverse;rotate clockwisewait20msl_mot_dir=stop:r_mot_dir=stopgetdistanceloopuntildistance>mindist;rotate right until clearendsub;-------------------submotors;left motorifl_mot_dir=stopthensetportd.0off:setportd.1off:setportd.2off:setportd.3offelseifl_mot_dir=forwardthenl_mot_pos++ifl_mot_pos=5thenl_mot_pos=1endifelsel_mot_pos---ifl_mot_pos=0thenl_mot_pos=4endifendif;selectcasel_mot_poscase4setportd.0on:setportd.1on:setportd.2off:setportd.3offcase3setportd.0off:setportd.1on:setportd.2on:setportd.3offcase2setportd.0off:setportd.1off:setportd.2on:setportd.3oncase1setportd.0on:setportd.1off:setportd.2off:setportd.3onendselect;;right motorifr_mot_dir=stopthensetportd.4off:setportd.5off:setportd.6off:setportd.7offelseifr_mot_dir=forwardthenr_mot_pos++ifr_mot_pos=5thenr_mot_pos=1endifelser_mot_pos---ifr_mot_pos=0thenr_mot_pos=4endifendif;selectcaser_mot_poscase4setportd.4on:setportd.5off:setportd.6off:setportd.7oncase3setportd.4off:setportd.5off:setportd.6on:setportd.7oncase2setportd.4off:setportd.5on:setportd.6on:setportd.7offcase1setportd.4on:setportd.5on:setportd.6off:setportd.7offendselectendsub;-------------------subservopulseoutservopin,servoposusendsub
Last edit: stan cartwright 2020-06-23
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
I wanted to try using V53L0X laser range finder but looked complicated.
I wanted to use 28byj-48 stepper motors but they need to be pulsed at 2ms for max torque/speed.
I sorted it for mega328. https://www.youtube.com/watch?v=Y_ai0tc_rek
Lots of code for your own projects like using V53L0X. using stepper motors driven by interrupt, using one interrupt for 2 events like running the motors and servo. Hope there's something useful.
Last edit: stan cartwright 2020-06-23