Lego Technic of the Past Arduino Library
LegoTechnic Header File
/* LegoTechnic.h - Library to run Lego Technic 70455 Controller brick with an Arduino Shield. Created December 16, 2015 Rights Reserved */
#ifndef LegoTechnic_h #define LegoTechnic_h #include "Arduino.h" // class LegoTechnic { public: // #define PORT0_PIN 3 #define PORT1_PIN 5 #define PORT2_PIN 6 #define PORT3_PIN 9 #define PORT4_PIN 10 #define PORT5_PIN 11 #define PORT6_ANALOGPIN 0 #define PORT7_ANALOGPIN 1 #define PORT_ON HIGH #define PORT_OFF LOW #define COMBO_OFF 0 #define COMBO_LEFT 1 #define COMBO_RIGHT 2 #define COMBO_BOTH 3 // LegoTechnic(); LegoTechnic(int P0, int P1, int P2, int P3, int P4, int P5, int P6, int P7); void Output_Port(int id, int action); void PWM_Port(int id, int pwm_value); int Input_Port(int id); void Combo_Port(char id, int mix); void PWM_Combo_Port(char id, int mix, int pwm_value); void Port_Initialize(); int Port_PWM_Value(int id); void Verbose(int value); void Parse_Command(String Command); private: int _D0,_D1,_D2,_D3,_D4,_D5,_A6,_A7; int _Verbose = HIGH; int _Port_PWM[6] = {0, 0, 0, 0, 0, 0}; void _Parse_PWM_Command(String Port, String Value); void _Parse_Verbose_Command(String Value); void _Parse_CPWM_Command(String Port, String Action, String Value); void _Parse_Port_Command(String Port, String Action); void _Parse_Combo_Command(String Port, String Action); void _Parse_Input_Command(String Port); void _Display_Commands(); void _Display_PWM_Values(); }; // #endif
CODE
#include "Arduino.h" #include "LegoTechnic.h"
#define PORT_ON HIGH #define PORT_OFF LOW
#define COMBO_OFF 0 #define COMBO_LEFT 1 #define COMBO_RIGHT 2 #define COMBO_BOTH 3
LegoTechnic::LegoTechnic() {
_D0 = PORT0_PIN; _D1 = PORT1_PIN; _D2 = PORT2_PIN; _D3 = PORT3_PIN; _D4 = PORT4_PIN; _D5 = PORT5_PIN; _A6 = PORT6_ANALOGPIN; _A7 = PORT7_ANALOGPIN;
}
LegoTechnic::LegoTechnic(int P0, int P1, int P2, int P3, int P4, int P5, int P6, int P7) {
_D0 = P0; _D1 = P1; _D2 = P2; _D3 = P3; _D4 = P4; _D5 = P5; _A6 = P6; _A7 = P7;
}
void LegoTechnic::Output_Port(int id, int action) {
int pin_id; int pin_value; int valid_command = 1; switch (id) { case 0: pin_id = _D0; break; case 1: pin_id = _D1; break; case 2: pin_id = _D2; break; case 3: pin_id = _D3; break; case 4: pin_id = _D4; break; case 5: pin_id = _D5; break; default: if (_Verbose == HIGH) {Serial.println("Invalid Port Identified.");} valid_command = 0; break; } switch (action) { case PORT_ON: pin_value = HIGH; break; case PORT_OFF: pin_value = LOW; break; default: if (_Verbose == HIGH) {Serial.println("Invalid Port Status Identified.");} valid_command = 0; } if (valid_command == 1) { digitalWrite(pin_id, pin_value); if (_Verbose == HIGH) {Serial.println("Success PORT Command");} }
}
void LegoTechnic::PWM_Port(int id, int pwm_value) {
int pin_id; int valid_command =1; switch(id) { case 0: pin_id = _D0; break; case 1: pin_id = _D1; break; case 2: pin_id = _D2; break; case 3: pin_id = _D3; break; case 4: pin_id = _D4; break; case 5: pin_id = _D5; break; default: if (_Verbose == HIGH) {Serial.println("Invalid PWM Port Identified.");} valid_command = 0; break; } if ((pwm_value < 0) or (pwm_value > 255)) { if (_Verbose == HIGH) {Serial.println("Invalid PWM Value Identified.");} valid_command = 0; } if (valid_command == 1) { Port_PWM[id] = pwm_value; analogWrite(pin_id, pwm_value); if (_Verbose == HIGH) {Serial.println("Success PWM Command.");} }
}
int LegoTechnic::Input_Port(int id) {
int valid_command = 1; int pin_id; switch(id) { case 6: pin_id = _A6; break; case 7: pin_id = _A7; break; default: if (_Verbose == HIGH) {Serial.println("Invalid Input Port Identified.");} valid_command = 0; break; } if (valid_command == 1) { if (_Verbose == HIGH) {Serial.println("Success Input Command.");} return analogRead(pin_id); } else return -1;
}
void LegoTechnic::Combo_Port(char id, int mix) {
int leftport, rightport; int leftvalue, rightvalue; int valid_command = 1; switch (id) { case 'A': leftport = 0; rightport = 1; break; case 'B': leftport = 2; rightport = 3; break; case 'C': leftport = 4; rightport = 5; break; default: if (_Verbose == HIGH) {Serial.println("Invalid Combo Port Identified.");} valid_command = 0; break; }
switch (mix) { case COMBO_OFF: leftvalue = LOW; rightvalue = LOW; break; case COMBO_LEFT: leftvalue = HIGH; rightvalue = LOW; break; case COMBO_RIGHT: leftvalue = LOW; rightvalue = HIGH; break; case COMBO_BOTH: leftvalue = HIGH; rightvalue = HIGH; break; default: if (_Verbose == HIGH) {Serial.println("Invalid Combo Port Action.");} valid_command =0; break; } if (valid_command ==1) { Output_Port(leftport, leftvalue); Output_Port(rightport, rightvalue); if (_Verbose == HIGH) {Serial.println("Successful COMBO Command.");} }
}
void LegoTechnic::PWM_Combo_Port(char id, int mix, int pwm_value) {
int leftport, rightport; int leftvalue, rightvalue; int valid_command = 1; switch (id) { case 'A': leftport = 0; rightport = 1; break; case 'B': leftport = 2; rightport = 3; break; case 'C': leftport = 4; rightport = 5; break; default: if (_Verbose == HIGH) {Serial.println("Invalid Combo Port Identified.");} valid_command = 0; break; }
switch (mix) { case COMBO_OFF: leftvalue = 0; rightvalue = 0; break; case COMBO_LEFT: leftvalue = pwm_value; rightvalue = 0; break; case COMBO_RIGHT: leftvalue = 0; rightvalue = pwm_value; break; case COMBO_BOTH: leftvalue = pwm_value; rightvalue = pwm_value; break; default: if (_Verbose == HIGH) {Serial.println("Invalid Combo Port Action.");} valid_command = 0; break; } if (valid_command ==1) { PWM_Port(leftport, leftvalue); PWM_Port(rightport, rightvalue); if (_Verbose == HIGH) {Serial.println("Successful CPWM Command.");} }
}
void LegoTechnic::Port_Initialize() {
pinMode(_D0, OUTPUT); analogWrite(_D0, 255); digitalWrite(_D0, LOW);
pinMode(_D1, OUTPUT); analogWrite(_D1, 255); digitalWrite(_D1, LOW);
pinMode(_D2, OUTPUT); analogWrite(_D2, 255); digitalWrite(_D2, LOW);
pinMode(_D3, OUTPUT); analogWrite(_D3, 255); digitalWrite(_D3, LOW);
pinMode(_D4, OUTPUT); analogWrite(_D4, 255); digitalWrite(_D4, LOW);
pinMode(_D5, OUTPUT); analogWrite(_D5, 255); digitalWrite(_D5, LOW);
if (_Verbose == HIGH) {Serial.println("Output Port PWM values set to 255.");}
}
void LegoTechnic::Verbose(int value) {
_Verbose = value;
}
void LegoTechnic::Parse_Command(String Command) {
int valid_command = 0; String sub_string; String command_string; String port_string; String action_string; String value_string; if (_Verbose == HIGH) {Serial.println(Command);}
sub_string = Command.substring(0,4); if (sub_string.compareTo("?PWM") == 0) { _Display_PWM_Values(); valid_command = 1; } sub_string = Command.substring(0,2); if (sub_string.compareTo("?") == 0) { _Display_Commands(); valid_command = 1; } sub_string = Command.substring(0,4); if (sub_string.compareTo("PORT") == 0 ) { command_string = "PORT"; port_string = Command.substring(5,6); action_string = Command.substring(7,10); _Parse_Port_Command(port_string, action_string); valid_command = 1; }
sub_string = Command.substring(0,3);
if (sub_string.compareTo("PWM") == 0) { command_string = "PWM"; port_string = Command.substring(4,5); action_string = Command.substring(6); _Parse_PWM_Command(port_string, action_string); valid_command = 1; }
sub_string = Command.substring(0,5);
if (sub_string.compareTo("COMBO") == 0) { command_string = "COMBO"; port_string = Command.substring(6,7); action_string = Command.substring(8); _Parse_Combo_Command(port_string, action_string); valid_command = 1; }
sub_string = Command.substring(0,4); if (sub_string.compareTo("CPWM") == 0 ) { command_string = "CPWM"; port_string = Command.substring(5,6); action_string = Command.substring(7,12); value_string = Command.substring(12); _Parse_CPWM_Command(port_string, action_string, value_string); valid_command = 1; }
sub_string = Command.substring(0,5);
if (sub_string.compareTo("INPUT") == 0) { command_string = "INPUT"; port_string = Command.substring(6,7); _Parse_Input_Command(port_string); valid_command = 1; } sub_string = Command.substring(0,7);
if (sub_string.compareTo("VERBOSE") == 0) { command_string = "VERBOSE"; value_string = Command.substring(8,11); _Parse_Verbose_Command(value_string); valid_command = 1; } if (valid_command == 0) if (_Verbose == HIGH) {Serial.println("Huh?");}
}
void LegoTechnic::_Parse_Verbose_Command(String Value) {
int valid_command = 1; int action; if (Value.compareTo("ON") == 0) action = HIGH; else if (Value.compareTo("OFF") == 0) action = LOW; else valid_command = 0; if (valid_command == 1) Verbose(action); else if (_Verbose == HIGH) {Serial.println("VERBOSE Command Syntax Error.");}
}
void LegoTechnic::_Parse_Input_Command(String Port) {
int port_value; int return_value; port_value = Port.toInt(); return_value = Input_Port(port_value); Serial.println(return_value);
}
void LegoTechnic::_Parse_CPWM_Command(String Port, String Action, String Value)
{
char port_value; int action_value; int value_value; int valid_command = 1; if (Port.compareTo("A") == 0 ) port_value = 'A'; else if (Port.compareTo("B") == 0 ) port_value = 'B'; else if (Port.compareTo("C") == 0 ) port_value = 'C'; else valid_command = 0;;
if (Action.compareTo("LEFT ") == 0 ) action_value = COMBO_LEFT; else if (Action.compareTo("RIGHT") == 0 ) action_value = COMBO_RIGHT; else valid_command = 0; value_value = Value.toInt(); if (valid_command == 1) PWM_Combo_Port(port_value, action_value, value_value); else if (_Verbose == HIGH) {Serial.println("CPWM Command Syntax Error.");}
}
void LegoTechnic::_Parse_PWM_Command(String Port, String Value) {
int port_value; int action_value; port_value = Port.toInt(); action_value = Value.toInt(); PWM_Port(port_value, action_value);
}
void LegoTechnic::_Parse_Combo_Command(String Port, String Action)
{
char port_value; int action_value; port_value = Port.toInt(); if (Port.compareTo("A") == 0 ) port_value = 'A'; else if (Port.compareTo("B") == 0 ) port_value = 'B'; else if (Port.compareTo("C") == 0 ) port_value = 'C'; else port_value = 'z'; if (Action.compareTo("LEFT") == 0) Combo_Port(port_value, COMBO_LEFT); else if (Action.compareTo("RIGHT") == 0) Combo_Port(port_value, COMBO_RIGHT); else if (Action.compareTo("OFF") == 0) Combo_Port(port_value, COMBO_OFF); else if (_Verbose == HIGH) {Serial.println("COMBO Command Syntax Error.");}
}
void LegoTechnic::_Parse_Port_Command(String Port, String Action) {
int port_value; int action_value; port_value = Port.toInt(); if (Action.compareTo("OFF") == 0) Output_Port(port_value, LOW); else if (Action.compareTo("ON") == 0) Output_Port(port_value, HIGH); else if (_Verbose == HIGH) {Serial.println("PORT Command Syntax Error.");}
}
void LegoTechnic::_Display_Commands()
{
if (_Verbose == HIGH) { Serial.println("Commands ..."); Serial.println("PORT [0..5] ON|OFF"); Serial.println("PWM [0..5] [0..255]"); Serial.println("COMBO A|B|C LEFT|RIGHT|OFF"); Serial.println("CPWM A|B|C LEFT|RIGHT [0..255]"); Serial.println("INPUT [6..7]"); Serial.println("?PWM"); Serial.println("VERBOSE ON|OFF"); }
}
void LegoTechnic::_Display_PWM_Values()
{
if (_Verbose == HIGH) { Serial.print("PORT 0 "); Serial.println(Port_PWM[0]); Serial.print("PORT 1 "); Serial.println(Port_PWM[1]); Serial.print("PORT 2 "); Serial.println(Port_PWM[2]); Serial.print("PORT 3 "); Serial.println(Port_PWM[3]); Serial.print("PORT 4 "); Serial.println(Port_PWM[4]); Serial.print("PORT 5 "); Serial.println(Port_PWM[5]); }
}