1+ #include " ArduinoRobotMotorBoard.h"
2+ #include " EasyTransfer2.h"
3+ #include " Multiplexer.h"
4+ #include " LineFollow.h"
5+
6+ RobotMotorBoard::RobotMotorBoard (){
7+ // LineFollow::LineFollow();
8+ }
9+ /* void RobotMotorBoard::beginIRReceiver(){
10+ IRrecv::enableIRIn();
11+ }*/
12+ void RobotMotorBoard::begin (){
13+ // initialze communication
14+ Serial1.begin (9600 );
15+ messageIn.begin (&Serial1);
16+ messageOut.begin (&Serial1);
17+
18+ // init MUX
19+ uint8_t MuxPins[]={MUXA,MUXB,MUXC};
20+ this ->IRs .begin (MuxPins,MUX_IN,3 );
21+ pinMode (MUXI,INPUT);
22+ digitalWrite (MUXI,LOW);
23+
24+ isPaused=false ;
25+ }
26+
27+ void RobotMotorBoard::process (){
28+ if (isPaused)return ;// skip process if the mode is paused
29+
30+ if (mode==MODE_SIMPLE){
31+ // Serial.println("s");
32+ // do nothing? Simple mode is just about getting commands
33+ }else if (mode==MODE_LINE_FOLLOW){
34+ // do line following stuff here.
35+ LineFollow::runLineFollow ();
36+ }else if (mode==MODE_ADJUST_MOTOR){
37+ // Serial.println('a');
38+ // motorAdjustment=analogRead(POT);
39+ // setSpeed(255,255);
40+ // delay(100);
41+ }
42+ }
43+ void RobotMotorBoard::pauseMode (bool onOff){
44+ if (onOff){
45+ isPaused=true ;
46+ }else {
47+ isPaused=false ;
48+ }
49+ stopCurrentActions ();
50+
51+ }
52+ void RobotMotorBoard::parseCommand (){
53+ uint8_t modeName;
54+ uint8_t codename;
55+ int value;
56+ int speedL;
57+ int speedR;
58+ if (this ->messageIn .receiveData ()){
59+ // Serial.println("data received");
60+ uint8_t command=messageIn.readByte ();
61+ // Serial.println(command);
62+ switch (command){
63+ case COMMAND_SWITCH_MODE:
64+ modeName=messageIn.readByte ();
65+ setMode (modeName);
66+ break ;
67+ case COMMAND_RUN:
68+ if (mode==MODE_LINE_FOLLOW)break ;// in follow line mode, the motor does not follow commands
69+ speedL=messageIn.readInt ();
70+ speedR=messageIn.readInt ();
71+ motorsWrite (speedL,speedR);
72+ break ;
73+ case COMMAND_MOTORS_STOP:
74+ motorsStop ();
75+ break ;
76+ case COMMAND_ANALOG_WRITE:
77+ codename=messageIn.readByte ();
78+ value=messageIn.readInt ();
79+ _analogWrite (codename,value);
80+ break ;
81+ case COMMAND_DIGITAL_WRITE:
82+ codename=messageIn.readByte ();
83+ value=messageIn.readByte ();
84+ _digitalWrite (codename,value);
85+ break ;
86+ case COMMAND_ANALOG_READ:
87+ codename=messageIn.readByte ();
88+ _analogRead (codename);
89+ break ;
90+ case COMMAND_DIGITAL_READ:
91+ codename=messageIn.readByte ();
92+ _digitalRead (codename);
93+ break ;
94+ case COMMAND_READ_IR:
95+ _readIR ();
96+ break ;
97+ case COMMAND_READ_TRIM:
98+ _readTrim ();
99+ break ;
100+ case COMMAND_PAUSE_MODE:
101+ pauseMode (messageIn.readByte ());// onOff state
102+ break ;
103+ case COMMAND_LINE_FOLLOW_CONFIG:
104+ LineFollow::config (
105+ messageIn.readByte (), // KP
106+ messageIn.readByte (), // KD
107+ messageIn.readByte (), // robotSpeed
108+ messageIn.readByte () // IntegrationTime
109+ );
110+ break ;
111+ }
112+ }
113+ // delay(5);
114+ }
115+ uint8_t RobotMotorBoard::parseCodename (uint8_t codename){
116+ switch (codename){
117+ case B_TK1:
118+ return TK1;
119+ case B_TK2:
120+ return TK2;
121+ case B_TK3:
122+ return TK3;
123+ case B_TK4:
124+ return TK4;
125+ }
126+ }
127+ uint8_t RobotMotorBoard::codenameToAPin (uint8_t codename){
128+ switch (codename){
129+ case B_TK1:
130+ return A0;
131+ case B_TK2:
132+ return A1;
133+ case B_TK3:
134+ return A6;
135+ case B_TK4:
136+ return A11;
137+ }
138+ }
139+
140+ void RobotMotorBoard::setMode (uint8_t mode){
141+ if (mode==MODE_LINE_FOLLOW){
142+ LineFollow::calibIRs ();
143+ }
144+ /* if(mode==SET_MOTOR_ADJUSTMENT){
145+ save_motor_adjustment_to_EEPROM();
146+ }
147+ */
148+ /* if(mode==MODE_IR_CONTROL){
149+ beginIRReceiver();
150+ }*/
151+ this ->mode =mode;
152+ // stopCurrentActions();//If line following, this should stop the motors
153+ }
154+
155+ void RobotMotorBoard::stopCurrentActions (){
156+ motorsStop ();
157+ // motorsWrite(0,0);
158+ }
159+
160+ void RobotMotorBoard::motorsWrite (int speedL, int speedR){
161+ /* Serial.print(speedL);
162+ Serial.print(" ");
163+ Serial.println(speedR);*/
164+ // motor adjustment, using percentage
165+ _refreshMotorAdjustment ();
166+
167+ if (motorAdjustment<0 ){
168+ speedR*=(1 +motorAdjustment);
169+ }else {
170+ speedL*=(1 -motorAdjustment);
171+ }
172+
173+ if (speedL>0 ){
174+ analogWrite (IN_A1,speedL);
175+ analogWrite (IN_A2,0 );
176+ }else {
177+ analogWrite (IN_A1,0 );
178+ analogWrite (IN_A2,-speedL);
179+ }
180+
181+ if (speedR>0 ){
182+ analogWrite (IN_B1,speedR);
183+ analogWrite (IN_B2,0 );
184+ }else {
185+ analogWrite (IN_B1,0 );
186+ analogWrite (IN_B2,-speedR);
187+ }
188+ }
189+ void RobotMotorBoard::motorsWritePct (int speedLpct, int speedRpct){
190+ // speedLpct, speedRpct ranges from -100 to 100
191+ motorsWrite (speedLpct*2.55 ,speedRpct*2.55 );
192+ }
193+ void RobotMotorBoard::motorsStop (){
194+ analogWrite (IN_A1,255 );
195+ analogWrite (IN_A2,255 );
196+
197+ analogWrite (IN_B1,255 );
198+ analogWrite (IN_B2,255 );
199+ }
200+
201+
202+ /*
203+ *
204+ *
205+ * Input and Output ports
206+ *
207+ *
208+ */
209+ void RobotMotorBoard::_digitalWrite (uint8_t codename,bool value){
210+ uint8_t pin=parseCodename (codename);
211+ digitalWrite (pin,value);
212+ }
213+ void RobotMotorBoard::_analogWrite (uint8_t codename,int value){
214+ // There's no PWM available on motor board
215+ }
216+ void RobotMotorBoard::_digitalRead (uint8_t codename){
217+ uint8_t pin=parseCodename (codename);
218+ bool value=digitalRead (pin);
219+ messageOut.writeByte (COMMAND_DIGITAL_READ_RE);
220+ messageOut.writeByte (codename);
221+ messageOut.writeByte (value);
222+ messageOut.sendData ();
223+ }
224+ void RobotMotorBoard::_analogRead (uint8_t codename){
225+ uint8_t pin=codenameToAPin (codename);
226+ int value=analogRead (pin);
227+ messageOut.writeByte (COMMAND_ANALOG_READ_RE);
228+ messageOut.writeByte (codename);
229+ messageOut.writeInt (value);
230+ messageOut.sendData ();
231+ }
232+ int RobotMotorBoard::IRread (uint8_t num){
233+ IRs.selectPin (num-1 ); // To make consistant with the pins labeled on the board
234+ return IRs.getAnalogValue ();
235+ }
236+
237+ void RobotMotorBoard::_readIR (){
238+ // Serial.println("readIR");
239+ int value;
240+ messageOut.writeByte (COMMAND_READ_IR_RE);
241+ for (int i=1 ;i<6 ;i++){
242+ value=IRread (i);
243+ messageOut.writeInt (value);
244+ }
245+ messageOut.sendData ();
246+ }
247+
248+ void RobotMotorBoard::_readTrim (){
249+ int value=analogRead (TRIM);
250+ messageOut.writeByte (COMMAND_READ_TRIM_RE);
251+ messageOut.writeInt (value);
252+ messageOut.sendData ();
253+ }
254+
255+ void RobotMotorBoard::_refreshMotorAdjustment (){
256+ motorAdjustment=map (analogRead (TRIM),0 ,1023 ,-30 ,30 )/100.0 ;
257+ }
258+
259+ void RobotMotorBoard::reportActionDone (){
260+ setMode (MODE_SIMPLE);
261+ messageOut.writeByte (COMMAND_ACTION_DONE);
262+ messageOut.sendData ();
263+ }
264+
265+ RobotMotorBoard RobotMotor=RobotMotorBoard();
0 commit comments