commit 55f5139939d558a9e8590b23864296bb66a14a56 Author: bastien.druillette@ecam.fr Date: Mon Mar 17 14:17:09 2025 +0100 I add the arduino library to the file diff --git a/Makeblock-Libraries-master/README.md b/Makeblock-Libraries-master/README.md new file mode 100644 index 0000000..8e01461 --- /dev/null +++ b/Makeblock-Libraries-master/README.md @@ -0,0 +1,65 @@ +# Makeblock Library v3.27 + +Arduino Library for Makeblock Electronic Modules + +# Copyright notice + +In makeblock's library, some of the modules are derived from other open source projects, and also part of some code is inspired by the algorithms of other individuals or organizations. We will retain the copyright of the original open source code. + +These modules is derived from other open source projects: + +- MeRGBLed +- MeHumitureSensor +- Me7SegmentDisplay +- MeOneWire +- MeStepper + +and these modules is inspired by some projects: + +- MeUSBHost + +As an open source library, we respect all contributors to the open source community and thank you very much for everyone's supervision. + +If you have a discussion about licensing issues, please contact me (myan@makeblock.com -- Mark Yan) + +### How to use: + +1. Download the source from the git https://codeload.github.com/Makeblock-official/Makeblock-Libraries/zip/master + +2. In the Arduino IDE: "Sketch-> Include Library-> Add .ZIP Library-> select the downloaded file-> Open" + +3. Click "File-> Examples". There are some test programs in "MakeBlockDrive->" + +4. Depending on the type of board you're using, you need to modify the header file to match. + + For example, if you're using a mCore. You should change `#include ` to `#include ` + Corresponding boards and there header file are: + + Orion <--------> MeOrion.h + + BaseBoard <----> MeBaseBoard.h + + mCore <--------> MeMCore.h + + Shield <-------> MeShield.h + + Auriga <-------> MeAuriga.h + + MegaPi <-------> MeMegaPi.h + +### Revision of history: + +|Author | Time | Version | Descr | +|:-------- | :-----: | :----: | :----- | +|Mark Yan | 2015/07/24 | 3.0.0 | Rebuild the old lib.| +|Rafael Lee | 2015/09/02 | 3.1.0 | Added some comments and macros.| +|Lawrence | 2015/09/09 | 3.2.0 | Include some Arduino's official headfiles which path specified.| +|Mark Yan | 2015/11/02 | 3.2.1 | fix bug on MACOS.| +|Mark Yan | 2016/01/21 | 3.2.2 | fix some library bugs.| +|Mark Yan | 2016/05/17 | 3.2.3 | add support for MegaPi and Auriga Board.| +|Mark Yan | 2016/07/27 | 3.2.4 | fix some JIRA issue, add PID motion for Megapi/Auriga on board encoder motor.| +|Mark Yan   | 2018/05/16 | 3.2.5 | Correct copyright information.| +|Vincent He | 2019/01/04 | 3.2.6 | 1.Mbot /ranger adds the function of communication variables. 2.Solve the blocking problem of 9g steering gear. 3.Solve the problem that the intelligent steering gear cannot read back the parameters. 4.Add version number function. 5.High power code motor reinforcement version query function. 6.Solve the problem of SetColor (uint8_t index, long value) function error in mergharp.cpp. 7.The mBot board cannot extinguish the RGB. First upload the program with the RGB in any color, and then upload the program with the RGB in all colors. The RGB cannot extinguish (MeRGBLed bled. CPP file). 8.In the MegaPi firmware, SLOT1 is changed to slot_num instead of parameter transmission in the command processing stepper motor.| +|Vincent He | 2019/09/02 | 3.2.7 | 1.fix the problem that the electronic compass Mecompass is hung on the Orion mainboard 7 or 8 ports and communication will be hung dead. 2.fix the problem that the function getPointFast() in MeHumitureSensor.cpp does not normally output the value. 3.fix the problem that compile smartservo_test.ino firmware error report using the arduino1.6.5 environment with mBlock V3.4.12. 4.remove MeSuperVariable.cpp/MeSuperVariable.h. 5.fix the problem that ultrasonic module can only measure the maximum range of 375cm,and the maximum range of normal requirements is 400cm.| + +### Learn more from Makeblock official website: www.makeblock.com diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/baseboard_firmware/baseboard_firmware.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/baseboard_firmware/baseboard_firmware.ino new file mode 100644 index 0000000..060fce9 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/baseboard_firmware/baseboard_firmware.ino @@ -0,0 +1,712 @@ +/************************************************************************* +* File Name : baseboard_firmware.ino +* Author : Ander, Mark Yan +* Updated : Ander, Mark Yan +* Version : V0b.01.104 +* Date : 07/06/2016 +* Description : Firmware for Makeblock Electronic modules with Scratch. +* License : CC-BY-SA 3.0 +* Copyright (C) 2013 - 2016 Maker Works Technology Co., Ltd. All right reserved. +* http://www.makeblock.cc/ +**************************************************************************/ +#include +#include +#include +#include + +Servo servos[8]; +MeDCMotor dc; +MeTemperature ts; +MeRGBLed led; +MeUltrasonicSensor us; +Me7SegmentDisplay seg; +MePort generalDevice; +MeInfraredReceiver *ir = NULL; +MeGyro gyro; +MeJoystick joystick; +MeStepper steppers[2]; +MeBuzzer buzzer; +MeHumiture humiture; +MeFlameSensor FlameSensor; +MeGasSensor GasSensor; + +typedef struct MeModule +{ + int device; + int port; + int slot; + int pin; + int index; + float values[3]; +} MeModule; + +union{ + byte byteVal[4]; + float floatVal; + long longVal; +}val; + +union{ + byte byteVal[8]; + double doubleVal; +}valDouble; + +union{ + byte byteVal[2]; + short shortVal; +}valShort; +MeModule modules[12]; +#if defined(__AVR_ATmega32U4__) + int analogs[12]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11}; +#endif +#if defined(__AVR_ATmega328P__) or defined(__AVR_ATmega168__) + int analogs[8]={A0,A1,A2,A3,A4,A5,A6,A7}; + MeEncoderMotor encoders[2]; +#endif +#if defined(__AVR_ATmega1280__)|| defined(__AVR_ATmega2560__) + int analogs[16]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15}; +#endif +String mVersion = "0b.01.104"; +boolean isAvailable = false; +boolean isBluetooth = false; + +int len = 52; +char buffer[32]; +char bufferBt[32]; +byte index = 0; +byte dataLen; +byte modulesLen=0; +boolean isStart = false; +unsigned char irRead; +char serialRead; +#define VERSION 0 +#define ULTRASONIC_SENSOR 1 +#define TEMPERATURE_SENSOR 2 +#define LIGHT_SENSOR 3 +#define POTENTIONMETER 4 +#define JOYSTICK 5 +#define GYRO 6 +#define SOUND_SENSOR 7 +#define RGBLED 8 +#define SEVSEG 9 +#define MOTOR 10 +#define SERVO 11 +#define ENCODER 12 +#define IR 13 +#define IRREMOTE 14 +#define PIRMOTION 15 +#define INFRARED 16 +#define LINEFOLLOWER 17 +#define IRREMOTECODE 18 +#define SHUTTER 20 +#define LIMITSWITCH 21 +#define BUTTON 22 +#define HUMITURE 23 +#define FLAMESENSOR 24 +#define GASSENSOR 25 +#define COMPASS 26 +#define DIGITAL 30 +#define ANALOG 31 +#define PWM 32 +#define SERVO_PIN 33 +#define TONE 34 +#define PULSEIN 37 +#define ULTRASONIC_ARDUINO 36 +#define STEPPER 40 +#define LEDMATRIX 41 +#define TIMER 50 +#define TOUCH_SENSOR 51 + +#define GET 1 +#define RUN 2 +#define RESET 4 +#define START 5 +float angleServo = 90.0; +int servo_pins[8]={0,0,0,0,0,0,0,0}; +unsigned char prevc=0; +double lastTime = 0.0; +double currentTime = 0.0; +uint8_t keyPressed = 0; +uint8_t command_index = 0; + +void setup(){ + pinMode(13,OUTPUT); + digitalWrite(13,HIGH); + delay(300); + digitalWrite(13,LOW); + Serial.begin(115200); + delay(500); + buzzerOn(); + delay(100); + buzzerOff(); + #if defined(__AVR_ATmega328P__) or defined(__AVR_ATmega168__) + encoders[0] = MeEncoderMotor(SLOT_1); + encoders[1] = MeEncoderMotor(SLOT_2); + encoders[0].begin(); + encoders[1].begin(); + delay(500); + encoders[0].runSpeed(0); + encoders[1].runSpeed(0); + #else + Serial1.begin(115200); + #endif + gyro.begin(); + Serial.print("Version: "); + Serial.println(mVersion); +} +void loop(){ + currentTime = millis()/1000.0-lastTime; + if(ir != NULL) + { + ir->loop(); + } + readSerial(); + steppers[0].runSpeedToPosition(); + steppers[1].runSpeedToPosition(); + if(isAvailable){ + unsigned char c = serialRead&0xff; + if(c==0x55&&isStart==false){ + if(prevc==0xff){ + index=1; + isStart = true; + } + }else{ + prevc = c; + if(isStart){ + if(index==2){ + dataLen = c; + }else if(index>2){ + dataLen--; + } + writeBuffer(index,c); + } + } + index++; + if(index>51){ + index=0; + isStart=false; + } + if(isStart&&dataLen==0&&index>3){ + isStart = false; + parseData(); + index=0; + } + } +} +unsigned char readBuffer(int index){ + return isBluetooth?bufferBt[index]:buffer[index]; +} +void writeBuffer(int index,unsigned char c){ + if(isBluetooth){ + bufferBt[index]=c; + }else{ + buffer[index]=c; + } +} +void writeHead(){ + writeSerial(0xff); + writeSerial(0x55); +} +void writeEnd(){ + Serial.println(); + #if defined(__AVR_ATmega32U4__) + Serial1.println(); + #endif +} +void writeSerial(unsigned char c){ + Serial.write(c); + #if defined(__AVR_ATmega32U4__) + Serial1.write(c); + #endif +} +void readSerial(){ + isAvailable = false; + if(Serial.available()>0){ + isAvailable = true; + isBluetooth = false; + serialRead = Serial.read(); + } +#if defined(__AVR_ATmega32U4__) + if(Serial1.available()>0){ + isAvailable = true; + isBluetooth = true; + serialRead = Serial1.read(); + } +#endif +} +/* +ff 55 len idx action device port slot data a +0 1 2 3 4 5 6 7 8 +*/ +void parseData(){ + isStart = false; + int idx = readBuffer(3); + command_index = (uint8_t)idx; + int action = readBuffer(4); + int device = readBuffer(5); + switch(action){ + case GET:{ + if(device != ULTRASONIC_SENSOR){ + writeHead(); + writeSerial(idx); + } + readSensor(device); + writeEnd(); + } + break; + case RUN:{ + runModule(device); + callOK(); + } + break; + case RESET:{ + //reset + dc.reset(M1); + dc.run(0); + dc.reset(M2); + dc.run(0); + dc.reset(PORT_1); + dc.run(0); + dc.reset(PORT_2); + dc.run(0); + + #if defined(__AVR_ATmega328P__) + encoders[0].runSpeed(0); + encoders[1].runSpeed(0); + #endif + callOK(); + } + break; + case START:{ + //start + callOK(); + } + break; + } +} +void callOK(){ + writeSerial(0xff); + writeSerial(0x55); + writeEnd(); +} +void sendByte(char c){ + writeSerial(1); + writeSerial(c); +} +void sendString(String s){ + int l = s.length(); + writeSerial(4); + writeSerial(l); + for(int i=0;i0) + { + led.setColorAt(idx-1,r,g,b); + } + else + { + led.setColor(r,g,b); + } + led.show(); + } + break; + case SERVO:{ + int slot = readBuffer(7); + pin = slot==1?mePort[port].s1:mePort[port].s2; + int v = readBuffer(8); + Servo sv = servos[searchServoPin(pin)]; + if(v >= 0 && v <= 180) + { + if(!sv.attached()) + { + sv.attach(pin); + } + sv.write(v); + } + } + break; + case SEVSEG:{ + if(seg.getPort()!=port){ + seg.reset(port); + } + float v = readFloat(7); + seg.display(v); + } + break; + case LIGHT_SENSOR:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + } + int v = readBuffer(7); + generalDevice.dWrite1(v); + } + break; + case SHUTTER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + } + int v = readBuffer(7); + if(v<2){ + generalDevice.dWrite1(v); + }else{ + generalDevice.dWrite2(v-2); + } + } + break; + case DIGITAL:{ + pinMode(pin,OUTPUT); + int v = readBuffer(7); + digitalWrite(pin,v); + } + break; + case PWM:{ + pinMode(pin,OUTPUT); + int v = readBuffer(7); + analogWrite(pin,v); + } + break; + case TONE:{ + pinMode(pin,OUTPUT); + int hz = readShort(7); + int ms = readShort(9); + if(ms>0){ + buzzer.tone(pin, hz, ms); + }else{ + buzzer.noTone(pin); + } + } + break; + case SERVO_PIN:{ + int v = readBuffer(7); + Servo sv = servos[searchServoPin(pin)]; + if(v >= 0 && v <= 180) + { + if(!sv.attached()) + { + sv.attach(pin); + } + sv.write(v); + } + } + break; + case TIMER:{ + lastTime = millis()/1000.0; + } + break; + } +} + +int searchServoPin(int pin){ + for(int i=0;i<8;i++){ + if(servo_pins[i] == pin){ + return i; + } + if(servo_pins[i]==0){ + servo_pins[i] = pin; + return i; + } + } + return 0; +} +void readSensor(int device){ + /************************************************** + ff 55 len idx action device port slot data a + 0 1 2 3 4 5 6 7 8 + ***************************************************/ + float value=0.0; + int port,slot,pin; + port = readBuffer(6); + pin = port; + switch(device){ + case ULTRASONIC_SENSOR:{ + if(us.getPort()!=port){ + us.reset(port); + } + value = us.distanceCm(); + writeHead(); + writeSerial(command_index); + sendFloat(value); + } + break; + case TEMPERATURE_SENSOR:{ + slot = readBuffer(7); + if(ts.getPort()!=port||ts.getSlot()!=slot){ + ts.reset(port,slot); + } + value = ts.temperature(); + sendFloat(value); + } + break; + case LIGHT_SENSOR: + case SOUND_SENSOR: + case POTENTIONMETER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.aRead2(); + sendFloat(value); + } + break; + case JOYSTICK:{ + slot = readBuffer(7); + if(joystick.getPort() != port){ + joystick.reset(port); + } + value = joystick.read(slot); + sendFloat(value); + } + break; + case INFRARED: + { + if(ir == NULL) + { + ir = new MeInfraredReceiver(port); + ir->begin(); + } + else if(ir->getPort() != port) + { + delete ir; + ir = new MeInfraredReceiver(port); + ir->begin(); + } + irRead = ir->getCode(); + if((irRead < 255) && (irRead > 0)) + { + sendFloat((float)irRead); + } + else + { + sendFloat(0); + } + } + break; + case PIRMOTION:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead2(); + sendFloat(value); + } + break; + case LINEFOLLOWER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin1(),INPUT); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead1()*2+generalDevice.dRead2(); + sendFloat(value); + } + break; + case LIMITSWITCH:{ + slot = readBuffer(7); + if(generalDevice.getPort()!=port||generalDevice.getSlot()!=slot){ + generalDevice.reset(port,slot); + } + if(slot==1){ + pinMode(generalDevice.pin1(),INPUT_PULLUP); + value = !generalDevice.dRead1(); + }else{ + pinMode(generalDevice.pin2(),INPUT_PULLUP); + value = !generalDevice.dRead2(); + } + sendFloat(value); + } + break; +// case COMPASS:{ +// if(Compass.getPort()!=port){ +// Compass.reset(port); +// Compass.setpin(Compass.pin1(),Compass.pin2()); +// } +// double CompassAngle; +// CompassAngle = Compass.getAngle(); +// sendDouble(CompassAngle); +// } +// break; + case HUMITURE:{ + uint8_t index = readBuffer(7); + if(humiture.getPort()!=port){ + humiture.reset(port); + } + uint8_t HumitureData; + humiture.update(); + HumitureData = humiture.getValue(index); + sendByte(HumitureData); + } + break; + case FLAMESENSOR:{ + if(FlameSensor.getPort()!=port){ + FlameSensor.reset(port); + FlameSensor.setpin(FlameSensor.pin2(),FlameSensor.pin1()); + } + int16_t FlameData; + FlameData = FlameSensor.readAnalog(); + sendShort(FlameData); + } + break; + case GASSENSOR:{ + if(GasSensor.getPort()!=port){ + GasSensor.reset(port); + GasSensor.setpin(GasSensor.pin2(),GasSensor.pin1()); + } + int16_t GasData; + GasData = GasSensor.readAnalog(); + sendShort(GasData); + } + break; + case GYRO:{ + int axis = readBuffer(7); + gyro.update(); + if(axis == 1){ + value = gyro.getAngleX(); + sendFloat(value); + }else if(axis == 2){ + value = gyro.getAngleY(); + sendFloat(value); + }else if(axis == 3){ + value = gyro.getAngleZ(); + sendFloat(value); + } + } + break; + case VERSION:{ + sendString(mVersion); + } + break; + case DIGITAL:{ + pinMode(pin,INPUT); + sendFloat(digitalRead(pin)); + } + break; + case ANALOG:{ + pin = analogs[pin]; + pinMode(pin,INPUT); + sendFloat(analogRead(pin)); + } + break; + case PULSEIN:{ + int pw = readShort(7); + pinMode(pin, INPUT); + sendShort(pulseIn(pin,HIGH,pw)); + } + break; + case ULTRASONIC_ARDUINO:{ + int trig = readBuffer(6); + int echo = readBuffer(7); + pinMode(trig,OUTPUT); + digitalWrite(trig,LOW); + delayMicroseconds(2); + digitalWrite(trig,HIGH); + delayMicroseconds(10); + digitalWrite(trig,LOW); + pinMode(echo, INPUT); + sendFloat(pulseIn(echo,HIGH,30000)/58.0); + } + break; + case TIMER:{ + sendFloat((float)currentTime); + } + break; + } +} diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/four_in_one_firmware/four_in_one_firmware.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/four_in_one_firmware/four_in_one_firmware.ino new file mode 100644 index 0000000..a4a2260 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/four_in_one_firmware/four_in_one_firmware.ino @@ -0,0 +1,1235 @@ +/************************************************************************* +* File Name : mblock_Firmware.ino +* Author : myan +* Updated : myan +* Version : V3.2 +* Date : 12/05/2015 +* Description : Firmware for Makeblock Electronic modules with Scratch. +* License : CC-BY-SA 3.0 +* Copyright (C) 2013 - 2016 Maker Works Technology Co., Ltd. All right reserved. +* http://www.makeblock.cc/ +**************************************************************************/ + +/************************************************************************* + * Product and definitions +**************************************************************************/ +//1-baseboard, 2-Orion, 3-mCore, 4-shield +#define PRO_SELECT 0x02 + +#if (PRO_SELECT == 0x01) + #define PRO_ME_BASEBOARD +#elif (PRO_SELECT == 0x02) + #define PRO_ME_ORION +#elif (PRO_SELECT == 0x03) + #define PRO_ME_CORE +#elif (PRO_SELECT == 0x04) + #define PRO_ME_SHIELD +#else + #define PRO_ME_ORION +#endif +/************************************************************************* + * Function Module Definition +**************************************************************************/ +//#define DEV_TEMPERATURE_SENSOR +//#define DEV_GYRO +//#define DEV_RGBLED +//#define DEV_SEVSEG +//#define DEV_ENCODER +//#define DEV_IR +//#define DEV_INFRARED +//#define DEV_HUMITURE +//#define DEV_COMPASS +//#define DEV_LEDMATRIX +//#define DEV_STEPPER + +#include +#include +#include + +#if defined(PRO_ME_BASEBOARD) +#include +#elif defined(PRO_ME_ORION) +#include +#elif defined(PRO_ME_CORE) +#include +#elif defined(PRO_ME_SHIELD) +#include +#endif + +MeDCMotor dc; +MeUltrasonicSensor us; +MeJoystick joystick; +MePort generalDevice; +#if (defined PRO_ME_CORE) +MeBuzzer buzzer; +#endif // PRO_ME_CORE +MeFlameSensor FlameSensor; +MeGasSensor GasSensor; +Servo servos[8]; + +#if defined(DEV_TEMPERATURE_SENSOR) +MeTemperature ts; +#endif // DEV_TEMPERATURE_SENSOR + +#if defined(DEV_RGBLED) +MeRGBLed led(0,30); +#endif // DEV_RGBLED + +#if (defined DEV_SEVSEG) +Me7SegmentDisplay seg; +#endif // DEV_SEVSEG + +#if (defined DEV_LEDMATRIX) +MeLEDMatrix ledMx; +#endif // DEV_LEDMATRIX + +#if ((defined DEV_IR) && (defined PRO_ME_CORE)) +MeIR ir; +#endif // DEV_IR && PRO_ME_CORE + +#if (defined DEV_GYRO) +MeGyro gyro; +#endif // DEV_GYRO + +#if (defined DEV_COMPASS) +MeCompass Compass; +#endif // DEV_COMPASS + +#if (defined DEV_HUMITURE) +MeHumiture humiture; +#endif // DEV_HUMITURE + +#if (defined DEV_INFRARED) +MeInfraredReceiver *ir_read = NULL; +#endif // DEV_INFRARED + +#if (defined DEV_STEPPER) + #if defined(PRO_ME_SHIELD) + MeStepper steppers[4]; + #elif ((defined PRO_ME_ORION) || (defined PRO_ME_BASEBOARD)) + MeStepper steppers[2]; + #endif +#endif // DEV_STEPPER + +#if (defined DEV_ENCODER) +MeEncoderMotor *encoders[4] = {NULL,NULL,NULL,NULL}; +#endif // DEV_ENCODER + +union +{ + uint8_t byteVal[4]; + float floatVal; + long longVal; +}val; + +union +{ + uint8_t byteVal[4]; + double doubleVal; +}valDouble; + +union +{ + uint8_t byteVal[2]; + short shortVal; +}valShort; + +#if defined(__AVR_ATmega32U4__) +const uint8_t analogs[12] PROGMEM = {A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11}; +#elif defined(__AVR_ATmega328P__) +const uint8_t analogs[8] PROGMEM = {A0,A1,A2,A3,A4,A5,A6,A7}; +#elif defined(__AVR_ATmega2560__) +const uint8_t analogs[16] PROGMEM = {A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15}; +#endif + +boolean isAvailable = false; +boolean isStart = false; +#if defined(PRO_ME_BASEBOARD) +boolean isBluetooth = false; +#endif + +#if ((defined DEV_IR) && (defined PRO_ME_CORE)) +boolean irReady = false; +boolean irPressed = false; +#endif + +#if (defined PRO_ME_CORE) +boolean buttonPressed = false; +#endif //PRO_ME_CORE + +uint8_t len = 52; +uint8_t servo_pins[8]={0,0,0,0,0,0,0,0}; +uint8_t buffer[52]; +#if defined(PRO_ME_BASEBOARD) +uint8_t bufferBt[52]; +#endif // PRO_ME_BASEBOARD +uint8_t serialRead; +uint8_t prevc=0; +uint8_t index = 0; +uint8_t dataLen; +uint8_t modulesLen=0; +#if (defined DEV_INFRARED) +uint8_t irRead; +#endif // DEV_INFRARED + +#if (defined DEV_ENCODER) +uint8_t i2c_id[2] = {0,0}; +#endif // DEV_ENCODER + +#if (defined DEV_IR) && (defined PRO_ME_CORE) +uint8_t irRead = 0; +int16_t irDelay = 0; +int16_t irIndex = 0; +#endif // DEV_IR && PRO_ME_CORE + +float angleServo = 90.0; +double lastTime = 0.0; +double currentTime = 0.0; +double lastIRTime = 0.0; + +#if (defined DEV_IR) && (defined PRO_ME_CORE) +String irBuffer = ""; +#endif // DEV_IR && PRO_ME_CORE + +String mVersion = "10.01.102"; + +#define VERSION 0 +#define ULTRASONIC_SENSOR 1 +#define TEMPERATURE_SENSOR 2 +#define LIGHT_SENSOR 3 +#define POTENTIONMETER 4 +#define JOYSTICK 5 +#define GYRO 6 +#define SOUND_SENSOR 7 +#define RGBLED 8 +#define SEVSEG 9 +#define MOTOR 10 +#define SERVO 11 +#define ENCODER 12 +#define IR 13 +#define IRREMOTE 14 +#define PIRMOTION 15 +#define INFRARED 16 +#define LINEFOLLOWER 17 +#define IRREMOTECODE 18 +#define SHUTTER 20 +#define LIMITSWITCH 21 +#define BUTTON 22 +#define HUMITURE 23 +#define FLAMESENSOR 24 +#define GASSENSOR 25 +#define COMPASS 26 +#define DIGITAL 30 +#define ANALOG 31 +#define PWM 32 +#define SERVO_PIN 33 +#define TONE 34 +#define BUTTON_INNER 35 +#define ULTRASONIC_ARDUINO 36 +#define PULSEIN 37 +#define STEPPER 40 +#define LEDMATRIX 41 +#define TIMER 50 + +#define GET 1 +#define RUN 2 +#define RESET 4 +#define START 5 + +uint8_t readBuffer(uint8_t index) +{ +#if defined(PRO_ME_BASEBOARD) + if(isBluetooth) + { + return bufferBt[index]; + } + else + { + return buffer[index]; + } +#else //PRO_ME_BASEBOARD + return buffer[index]; +#endif //PRO_ME_BASEBOARD +} + +void writeBuffer(int16_t index,uint8_t c) +{ +#if defined(PRO_ME_BASEBOARD) + if(isBluetooth) + { + bufferBt[index]=c; + } + else + { + buffer[index]=c; + } +#else //PRO_ME_BASEBOARD + buffer[index]=c; +#endif //PRO_ME_BASEBOARD +} + +void writeHead(void) +{ + writeSerial(0xff); + writeSerial(0x55); +} + +void writeEnd(void) +{ +#if defined(PRO_ME_BASEBOARD) + if(isBluetooth) + { + Serial1.println(); + } + else + { + Serial.println(); + } +#else //PRO_ME_BASEBOARD + Serial.println(); +#endif //PRO_ME_BASEBOARD +} + +void writeSerial(uint8_t c) +{ +#if defined(PRO_ME_BASEBOARD) + if(isBluetooth) + { + Serial1.write(c); + } + else + { + Serial.write(c); + } +#else //PRO_ME_BASEBOARD + Serial.write(c); +#endif //PRO_ME_BASEBOARD +} + +void readSerial(void) +{ +#if defined(PRO_ME_BASEBOARD) + if(Serial1.available() > 0) + { + isAvailable = true; + isBluetooth = true; + serialRead = Serial1.read(); + } +#else + isAvailable = false; + if(Serial.available() > 0) + { + isAvailable = true; + serialRead = Serial.read(); + } +#endif +} + +/* +ff 55 len idx action device port slot data a +0 1 2 3 4 5 6 7 8 +*/ +void parseData() +{ + isStart = false; + uint8_t idx = readBuffer(3); + uint8_t action = readBuffer(4); + uint8_t device = readBuffer(5); + switch(action) + { + case GET: + { + writeHead(); + writeSerial(idx); + readSensor(device); + writeEnd(); + } + break; + case RUN: + { + runModule(device); + callOK(); + } + break; + case RESET:{ + //reset + dc.reset(M1); + dc.run(0); + dc.reset(M2); + dc.run(0); +#if (defined PRO_ME_CORE) + buzzer.noTone(); +#elif ((defined PRO_ME_CORE) || (defined PRO_ME_BASEBOARD)) + buzzerOff(); +#endif // PRO_ME_CORE +#if (defined DEV_ENCODER) + if(encoders[0] == NULL) + { + encoders[0]->runSpeed(0); + } + else if(encoders[1] == NULL) + { + encoders[1]->runSpeed(0); + } + else if(encoders[2] == NULL) + { + encoders[2]->runSpeed(0); + } + else if(encoders[3] == NULL) + { + encoders[3]->runSpeed(0); + } +#endif // DEV_ENCODER + callOK(); + } + break; + case START: + { + //start + callOK(); + } + break; + } +} + +void callOK(void) +{ + writeSerial(0xff); + writeSerial(0x55); + writeEnd(); +} + +void sendByte(uint8_t c) +{ + writeSerial(1); + writeSerial(c); +} + +void sendString(String s) +{ + int16_t l = s.length(); + writeSerial(4); + writeSerial(l); + for(int16_t i=0;i15) + { + break; + } + _receiveUint8[i] = readBuffer(idx+i); + } + return _receiveUint8; +} + +#if (defined DEV_ENCODER) +uint8_t SearchI2CID(uint8_t i2cid) +{ + for(uint8_t i=0; i<2; i++) + { + if(i2c_id[i] == i2cid) + { + return i; + } + if(i2c_id[i] == 0) + { + i2c_id[i] = i2cid; + return i; + } + } + i2c_id[0] = i2cid; + return 0; +} +#endif // DEV_ENCODER + +uint8_t searchServoPin(uint8_t pin) +{ + for(uint8_t i=0; i<8; i++) + { + if(servo_pins[i] == pin) + { + return i; + } + if(servo_pins[i] == 0) + { + servo_pins[i] = pin; + return i; + } + } + return 0; +} + +void runModule(uint8_t device) +{ + //0xff 0x55 0x6 0x0 0x2 0x22 0x9 0x0 0x0 0xa + uint8_t port = readBuffer(6); + uint8_t pin = port; + switch(device) + { + case MOTOR: + { + int16_t speed = readShort(7); + if(dc.getPort() != port) + { + dc.reset(port); + } + dc.run(speed); + } + break; + case JOYSTICK: + { + int16_t leftSpeed = readShort(6); + dc.reset(M1); + dc.run(leftSpeed); + int16_t rightSpeed = readShort(8); + dc.reset(M2); + dc.run(rightSpeed); + } + break; +#if (defined DEV_STEPPER) + case STEPPER: + { + int16_t maxSpeed = readShort(7); + long distance = readLong(9); +#if ((defined PRO_ME_ORION) || (defined PRO_ME_BASEBOARD) || (defined PRO_ME_SHIELD)) + if(port == PORT_1) + { + steppers[0] = MeStepper(PORT_1); + steppers[0].moveTo(distance); + steppers[0].setMaxSpeed(maxSpeed); + steppers[0].setSpeed(maxSpeed); + } + else if(port == PORT_2) + { + steppers[1] = MeStepper(PORT_2); + steppers[1].moveTo(distance); + steppers[1].setMaxSpeed(maxSpeed); + steppers[1].setSpeed(maxSpeed); + } +#endif +#if defined(PRO_ME_SHIELD) + else if(port == M1) + { + steppers[2] = MeStepper(M1); + steppers[2].moveTo(distance); + steppers[2].setMaxSpeed(maxSpeed); + steppers[2].setSpeed(maxSpeed); + } + else if(port == M2) + { + steppers[3] = MeStepper(M2); + steppers[3].moveTo(distance); + steppers[3].setMaxSpeed(maxSpeed); + steppers[3].setSpeed(maxSpeed); + } +#endif + } + break; +#endif // DEV_STEPPER +#if (defined DEV_ENCODER) + case ENCODER: + { + uint8_t i2cId = port; + uint8_t i2c_id_index; + uint8_t i2c_index; + int8_t slot = readBuffer(7); + int16_t maxSpeed = readShort(8); + long distance = readLong(10); + i2c_id_index = SearchI2CID(i2cId); + i2c_index = (i2c_id_index * 2 + slot) - 1; + if(encoders[i2c_index] == NULL) + { + encoders[i2c_index] = new MeEncoderMotor(i2cId,slot); + encoders[i2c_index]->begin(); + delay(50); + encoders[i2c_index]->runSpeed(0); + } + else if(i2c_id[i2c_id_index] != i2cId) + { + delete encoders[i2c_index]; + encoders[i2c_index] = new MeEncoderMotor(i2cId,slot); + encoders[i2c_index]->begin(); + delay(50); + encoders[i2c_index]->runSpeed(0); + } + encoders[i2c_index]->move(distance,maxSpeed); + } + break; +#endif // DEV_ENCODER +#if (defined DEV_RGBLED) + case RGBLED: + { + uint8_t slot = readBuffer(7); + uint8_t idx = readBuffer(8); + uint8_t r = readBuffer(9); + uint8_t g = readBuffer(10); + uint8_t b = readBuffer(11); + led.reset(port,slot); + if(idx > 0) + { + led.setColorAt(idx-1,r,g,b); + } + else + { + led.setColor(r,g,b); + } + led.show(); + } + break; +#endif // DEV_RGBLED + case SERVO: + { + uint8_t slot = readBuffer(7); + pin = slot==1?mePort[port].s1:mePort[port].s2; + uint8_t v = readBuffer(8); + Servo sv = servos[searchServoPin(pin)]; + if(v >= 0 && v <= 180) + { + if(port > 0) + { + sv.attach(pin); + sv.write(v); + } + } + } + break; +#if (defined DEV_SEVSEG) + case SEVSEG: + { + if(seg.getPort() != port) + { + seg.reset(port); + } + float v = readFloat(7); + seg.display(v); + } + break; +#endif // DEV_SEVSEG +#if (defined DEV_LEDMATRIX) + case LEDMATRIX: + { + if(ledMx.getPort() != port) + { + ledMx.reset(port); + } + uint8_t action = readBuffer(7); + if(action == 1) + { + uint8_t brightness = readBuffer(8); + uint8_t color = readBuffer(9); + int16_t px = readShort(10); + int16_t py = readShort(12); + uint8_t len = readBuffer(14); + char *s = readString(15,len); + ledMx.clearScreen(); + ledMx.setColorIndex(color); + ledMx.setBrightness(brightness); + ledMx.drawStr(px,py,s); + } + else if(action == 2) + { + uint8_t brightness = readBuffer(8); + uint8_t dw = readBuffer(9); + int16_t px = readShort(10); + int16_t py = readShort(12); + uint8_t len = readBuffer(14); + uint8_t *ss = readUint8(15,len); + ledMx.clearScreen(); + ledMx.setColorIndex(1); + ledMx.setBrightness(brightness); + ledMx.drawBitmap(px,py,dw,ss); + } + else if(action == 3) + { + uint8_t brightness = readBuffer(8); + uint8_t point = readBuffer(9); + int16_t hours = readShort(10); + int16_t minutes = readShort(12); + ledMx.clearScreen(); + ledMx.setColorIndex(1); + ledMx.setBrightness(brightness); + ledMx.showClock(hours,minutes,point); + } + } + break; +#endif // DEV_LEDMATRIX + case LIGHT_SENSOR: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + } + uint8_t v = readBuffer(7); + generalDevice.dWrite1(v); + } + break; +#if (defined DEV_IR) && (defined PRO_ME_CORE) + case IR: + { + String Str_data; + int16_t len = readBuffer(2)-3; + for(int16_t i=0;i 0) + { + buzzer.tone(hz,tone_time); + } + else + { + buzzer.noTone(); + } + } + break; +#endif // PRO_ME_CORE + case SERVO_PIN: + { + uint8_t v = readBuffer(7); + if(v >= 0 && v <= 180) + { + Servo sv = servos[searchServoPin(pin)]; + sv.attach(pin); + sv.write(v); + } + } + break; + case TIMER: + { + lastTime = millis()/1000.0; + } + break; + default: + break; + } +} + +void readSensor(uint8_t device) +{ + /************************************************** + ff 55 len idx action device port slot data a + 0 1 2 3 4 5 6 7 8 + 0xff 0x55 0x4 0x3 0x1 0x1 0x1 0xa + ***************************************************/ + uint8_t port,slot,pin; + float value = 0.0; + port = readBuffer(6); + pin = port; + switch(device) + { + case ULTRASONIC_SENSOR: + { + if(us.getPort() != port) + { + us.reset(port); + } + value = (float)us.distanceCm(50000); + sendFloat(value); + } + break; +#if defined(DEV_TEMPERATURE_SENSOR) + case TEMPERATURE_SENSOR: + { + slot = readBuffer(7); + if((ts.getPort() != port) || (ts.getSlot() != slot)) + { + ts.reset(port,slot); + } + value = ts.temperature(); + sendFloat(value); + } + break; +#endif // DEV_TEMPERATURE_SENSOR + case LIGHT_SENSOR: + case SOUND_SENSOR: + case POTENTIONMETER: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = (float)generalDevice.aRead2(); + sendFloat(value); + } + break; + case JOYSTICK: + { + slot = readBuffer(7); + if(joystick.getPort() != port) + { + joystick.reset(port); + } + value = joystick.read(slot); + sendFloat(value); + } + break; +#if (defined DEV_IR) && (defined PRO_ME_CORE) + case IR: + { + if(irReady) + { + sendString(irBuffer); + irReady = false; + irBuffer = ""; + } + } + break; + case IRREMOTE: + { + uint8_t r = readBuffer(7); + if((millis()/1000.0-lastIRTime) > 0.2) + { + sendByte(0); + } + else + { + sendByte(irRead==r); + } + //irRead = 0; + irIndex = 0; + } + break; + case IRREMOTECODE: + { + if(irRead<0xff) + { + sendByte(irRead); + } + irRead = 0; + irIndex = 0; + } + break; +#endif // DEV_IR && PRO_ME_CORE +#if (defined DEV_INFRARED) + case INFRARED: + { + if(ir_read == NULL) + { + ir_read = new MeInfraredReceiver(port); + ir_read->begin(); + } + else if(ir_read->getPort() != port) + { + delete ir_read; + ir_read = new MeInfraredReceiver(port); + ir_read->begin(); + } + irRead = ir_read->getCode(); + if((irRead < 255) && (irRead > 0)) + { + sendFloat((float)irRead); + } + else + { + sendFloat(0); + } + } + break; +#endif // DEV_INFRARED + case PIRMOTION: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead2(); + sendFloat(value); + } + break; + case LINEFOLLOWER: + { + if(generalDevice.getPort()!=port) + { + generalDevice.reset(port); + pinMode(generalDevice.pin1(),INPUT); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead1()*2+generalDevice.dRead2(); + sendFloat(value); + } + break; + case LIMITSWITCH: + { + slot = readBuffer(7); + if(generalDevice.getPort() != port || + generalDevice.getSlot() != slot) + { + generalDevice.reset(port,slot); + } + if(slot==1) + { + pinMode(generalDevice.pin1(),INPUT_PULLUP); + value = generalDevice.dRead1(); + } + else + { + pinMode(generalDevice.pin2(),INPUT_PULLUP); + value = generalDevice.dRead2(); + } + sendFloat(value); + } + break; +#if (defined PRO_ME_CORE) + case BUTTON_INNER: + { + //pin = analogs[pin]; + pin = pgm_read_byte(&analogs[pin]); + int8_t s = readBuffer(7); + pinMode(pin,INPUT); + boolean currentPressed = !(analogRead(pin)>10); + sendByte(s^(currentPressed?1:0)); + buttonPressed = currentPressed; + } + break; +#endif + +#if (defined DEV_COMPASS) + case COMPASS: + { + if(Compass.getPort() != port) + { + Compass.reset(port); + Compass.setpin(Compass.pin1(),Compass.pin2()); + } + double CompassAngle; + CompassAngle = Compass.getAngle(); + sendDouble(CompassAngle); + } + break; +#endif // DEV_COMPASS +#if (defined DEV_HUMITURE) + case HUMITURE: + { + uint8_t index = readBuffer(7); + if(humiture.getPort() != port) + { + humiture.reset(port); + } + uint8_t HumitureData; + humiture.update(); + HumitureData = humiture.getValue(index); + sendByte(HumitureData); + } + break; +#endif // DEV_HUMITURE + case FLAMESENSOR: + { + if(FlameSensor.getPort() != port) + { + FlameSensor.reset(port); + FlameSensor.setpin(FlameSensor.pin2(),FlameSensor.pin1()); + } + int16_t FlameData; + FlameData = FlameSensor.readAnalog(); + sendShort(FlameData); + } + break; + case GASSENSOR:{ + if(GasSensor.getPort() != port) + { + GasSensor.reset(port); + GasSensor.setpin(GasSensor.pin2(),GasSensor.pin1()); + } + int16_t GasData; + GasData = GasSensor.readAnalog(); + sendShort(GasData); + } + break; +#if (defined DEV_GYRO) + case GYRO: + { + int8_t axis = readBuffer(7); + gyro.update(); + value = gyro.getAngle(axis); + sendFloat(value); + } + break; +#endif // DEV_GYRO + case VERSION: + { + sendString(mVersion); + } + break; + case DIGITAL: + { + pinMode(pin,INPUT); + sendFloat(digitalRead(pin)); + } + break; + case ANALOG: + { + //pin = analogs[pin]; + pin = pgm_read_byte(&analogs[pin]); + pinMode(pin,INPUT); + sendFloat(analogRead(pin)); + } + break; + case TIMER: + { + sendFloat(currentTime); + } + break; + default: + break; + } +} + +void setup() +{ + pinMode(13,OUTPUT); + digitalWrite(13,HIGH); + delay(300); + digitalWrite(13,LOW); + Serial.begin(115200); + delay(500); +#if (defined PRO_ME_CORE) + buzzer.tone(500,50); + delay(100); + buzzer.noTone(); +#elif ((defined PRO_ME_CORE) || (defined PRO_ME_BASEBOARD)) + buzzerOn(); + delay(100); + buzzerOff(); +#endif // PRO_ME_CORE + +#if (defined DEV_IR) && (defined PRO_ME_CORE) + ir.begin(); +#endif // DEV_IR && PRO_ME_CORE + +#if ((defined DEV_RGBLED) && (defined PRO_ME_CORE)) + led.setpin(13); + led.setColor(0,0,0); + led.show(); +#endif // DEV_RGBLED && PRO_ME_CORE + +#if (defined DEV_GYRO) + gyro.begin(); +#endif // DEV_GYRO + Serial.print("Version: "); + Serial.println(mVersion); +} + +void loop() +{ + currentTime = millis()/1000.0-lastTime; +#if (defined DEV_INFRARED) + if(ir_read != NULL) + { + ir_read->loop(); + } +#endif // DEV_INFRARED +#if ((defined DEV_IR) && (defined PRO_ME_CORE)) + if(ir.decode()) + { + irRead = ((ir.value>>8)>>8)&0xff; + lastIRTime = millis()/1000.0; + irPressed = true; + if(irRead == 0xa || irRead == 0xd) + { + irIndex = 0; + irReady = true; + } + else + { + irBuffer+=irRead; + irIndex++; + if(irIndex>64) + { + irIndex = 0; + irBuffer = ""; + } + } + irDelay = 0; + } + else + { + irDelay++; + if(irRead > 0) + { + if(irDelay > 5000) + { + irRead = 0; + irDelay = 0; + } + } + } +#endif // DEV_IR && PRO_ME_CORE + readSerial(); +#if (defined DEV_STEPPER) + #if ((defined PRO_ME_ORION) || (defined PRO_ME_BASEBOARD) || (defined PRO_ME_SHIELD)) + steppers[0].runSpeedToPosition(); + steppers[1].runSpeedToPosition(); + #endif + #if defined(PRO_ME_SHIELD) + steppers[2].runSpeedToPosition(); + steppers[3].runSpeedToPosition(); + #endif +#endif // DEV_STEPPER + if(isAvailable) + { + unsigned char c = serialRead&0xff; + if((c == 0x55) && (isStart == false)) + { + if(prevc == 0xff) + { + index=1; + isStart = true; + } + } + else + { + prevc = c; + if(isStart) + { + if(index == 2) + { + dataLen = c; + } + else if(index>2) + { + dataLen--; + } + writeBuffer(index,c); + } + } + index++; + if(index > 51) + { + index=0; + isStart=false; + } + if(isStart && (dataLen == 0) && (index > 3)) + { + isStart = false; + parseData(); + index=0; + } + } +} diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/four_in_one_firmware/修改备忘.txt b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/four_in_one_firmware/修改备忘.txt new file mode 100644 index 0000000..480cd52 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/four_in_one_firmware/修改备忘.txt @@ -0,0 +1,28 @@ +1. 崫洫ʽΪ int16 +2. pulsein(35) ı޸ij 37 +3. ĬϿСģʽ ֱߴתλҡˣ紫 + Ѱߴģ飬λڲ(mbot)棬壬ģ飬ŷ + +4. ľõ long ṹ + +5. ľõ long ṹ + +Դ: + + RAM FLASH +Ĭϡ 1103(ʣ945òҪʹó450) 11184(ʣ21072) UNO, mCore, Shield + 1136(ʣ1424òҪ785) 14460(ʣ14212) 32U4 + + + +DEV_TEMPERATURE_SENSOR 18 1186 +DEV_GYRO 70 3144 +DEV_RGBLED 47 870 +DEV_SEVSEG 10 2710 +DEV_ENCODER 11 3874 +DEV_IR 59 2324 +DEV_INFRARED 57 2090 +DEV_HUMITURE 3 536 +DEV_COMPASS 330 5588 +DEV_LEDMATRIX 85 3072 +DEV_STEPPER 112 2978 \ No newline at end of file diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/mbot_factory_firmware/mbot_factory_firmware.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/mbot_factory_firmware/mbot_factory_firmware.ino new file mode 100644 index 0000000..f14b2b6 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/mbot_factory_firmware/mbot_factory_firmware.ino @@ -0,0 +1,1328 @@ + /************************************************************************* +* File Name : mbot_factory_firmware.ino +* Author : Ander, Mark Yan +* Updated : Ander, Mark Yan +* Version : V06.01.009 +* Date : 21/06/2017 +* Description : Firmware for Makeblock Electronic modules with Scratch. +* License : CC-BY-SA 3.0 +* Copyright (C) 2013 - 2017 Maker Works Technology Co., Ltd. All right reserved. +* http://www.makeblock.cc/ +**************************************************************************/ +#include +#include +#include + +MeRGBLed rgb(0,16); +MeUltrasonicSensor ultr(PORT_3); +MeLineFollower line(PORT_2); +MeLEDMatrix ledMx; +MeIR ir; +MeJoystick joystick; +MeBuzzer buzzer; +MeTemperature ts; +Me7SegmentDisplay seg; + +MeDCMotor MotorL(M1); +MeDCMotor MotorR(M2); +MePort generalDevice; +Servo servo; + +#define NTD1 294 +#define NTD2 330 +#define NTD3 350 +#define NTD4 393 +#define NTD5 441 +#define NTD6 495 +#define NTD7 556 +#define NTDL1 147 +#define NTDL2 165 +#define NTDL3 175 +#define NTDL4 196 +#define NTDL5 221 +#define NTDL6 248 +#define NTDL7 278 +#define NTDH1 589 +#define NTDH2 661 +#define NTDH3 700 +#define NTDH4 786 +#define NTDH5 882 +#define NTDH6 990 +#define NTDH7 112 + + +#define RUN_F 0x01 +#define RUN_B 0x01<<1 +#define RUN_L 0x01<<2 +#define RUN_R 0x01<<3 +#define STOP 0 + +#define BLUE_TOOTH 0 +#define IR_CONTROLER 1 + +uint8_t high = 15; +uint8_t low = 15; + +enum +{ + MODE_A, + MODE_B, + MODE_C +}; + +typedef struct MeModule +{ + int16_t device; + int16_t port; + int16_t slot; + int16_t pin; + int16_t index; + float values[3]; +} MeModule; + +union +{ + byte byteVal[4]; + float floatVal; + long longVal; +}val; + +union +{ + byte byteVal[8]; + double doubleVal; +}valDouble; + +union +{ + byte byteVal[2]; + short shortVal; +}valShort; + +MeModule modules[12]; + +char buffer[52]; +char bufferBt[52]; +char serialRead; +byte index = 0; +byte dataLen; +byte modulesLen=0; +unsigned char prevc=0; +String mVersion = "06.01.009"; + +boolean isAvailable = false; +boolean isStart = false; +boolean buttonPressed = false; +boolean currentPressed = false; +boolean pre_buttonPressed = false; + +float angleServo = 90.0; +double lastTime = 0.0; +double currentTime = 0.0; + +int len = 52; +int LineFollowFlag=0; +int moveSpeed = 200; +int minSpeed = 48; +int factor = 23; +int analogs[8]={A0,A1,A2,A3,A4,A5,A6,A7}; +int px = 0; + +uint8_t command_index = 0; +uint8_t motor_sta = STOP; +uint8_t mode = MODE_A; +uint8_t controlflag = IR_CONTROLER; + +#define VERSION 0 +#define ULTRASONIC_SENSOR 1 +#define TEMPERATURE_SENSOR 2 +#define LIGHT_SENSOR 3 +#define POTENTIONMETER 4 +#define JOYSTICK 5 +#define GYRO 6 +#define SOUND_SENSOR 7 +#define RGBLED 8 +#define SEVSEG 9 +#define MOTOR 10 +#define SERVO 11 +#define ENCODER 12 +#define IR 13 +#define IRREMOTE 14 +#define PIRMOTION 15 +#define INFRARED 16 +#define LINEFOLLOWER 17 +#define IRREMOTECODE 18 +#define SHUTTER 20 +#define LIMITSWITCH 21 +#define BUTTON 22 +#define HUMITURE 23 +#define FLAMESENSOR 24 +#define GASSENSOR 25 +#define COMPASS 26 +#define TEMPERATURE_SENSOR_1 27 +#define DIGITAL 30 +#define ANALOG 31 +#define PWM 32 +#define SERVO_PIN 33 +#define TONE 34 +#define BUTTON_INNER 35 +#define ULTRASONIC_ARDUINO 36 +#define PULSEIN 37 +#define STEPPER 40 +#define LEDMATRIX 41 +#define TIMER 50 +#define TOUCH_SENSOR 51 +#define JOYSTICK_MOVE 52 +#define COMMON_COMMONCMD 60 + //Secondary command + #define SET_STARTER_MODE 0x10 + #define SET_AURIGA_MODE 0x11 + #define SET_MEGAPI_MODE 0x12 + #define GET_BATTERY_POWER 0x70 + #define GET_AURIGA_MODE 0x71 + #define GET_MEGAPI_MODE 0x72 +#define ENCODER_BOARD 61 + //Read type + #define ENCODER_BOARD_POS 0x01 + #define ENCODER_BOARD_SPEED 0x02 + +#define ENCODER_PID_MOTION 62 + //Secondary command + #define ENCODER_BOARD_POS_MOTION 0x01 + #define ENCODER_BOARD_SPEED_MOTION 0x02 + #define ENCODER_BOARD_PWM_MOTION 0x03 + #define ENCODER_BOARD_SET_CUR_POS_ZERO 0x04 + #define ENCODER_BOARD_CAR_POS_MOTION 0x05 + +#define PM25SENSOR 63 + //Secondary command + #define GET_PM1_0 0x01 + #define GET_PM2_5 0x02 + #define GET_PM10 0x03 + +#define GET 1 +#define RUN 2 +#define RESET 4 +#define START 5 + +unsigned char readBuffer(int16_t index) +{ + return buffer[index]; +} + +void writeBuffer(int16_t index, unsigned char c) +{ + buffer[index]=c; +} + +void writeHead() +{ + writeSerial(0xff); + writeSerial(0x55); +} + +void writeEnd() +{ + Serial.println(); +} + +void writeSerial(unsigned char c) +{ + Serial.write(c); +} + +void readSerial() +{ + isAvailable = false; + if(Serial.available() > 0) + { + isAvailable = true; + serialRead = Serial.read(); + } +} + +void serialHandle() +{ + readSerial(); + if(isAvailable) + { + unsigned char c = serialRead & 0xff; + if((c == 0x55) && (isStart == false)) + { + if(prevc == 0xff) + { + index=1; + isStart = true; + } + } + else + { + prevc = c; + if(isStart) + { + if(index == 2) + { + dataLen = c; + } + else if(index > 2) + { + dataLen--; + } + writeBuffer(index,c); + } + } + index++; + if(index > 51) + { + index=0; + isStart = false; + } + if(isStart && (dataLen == 0) && (index > 3)) + { + isStart = false; + parseData(); + index=0; + } + } +} + +void buzzerOn() +{ + buzzer.tone(500,1000); +} + +void buzzerOff() +{ + buzzer.noTone(); +} + +void get_ir_command() +{ + static long time = millis(); + if(ir.decode()) + { + uint32_t value = ir.value; + time = millis(); + switch ((value >> 16) & 0xff) + { + case IR_BUTTON_A: + controlflag = IR_CONTROLER; + moveSpeed = 220; + mode = MODE_A; + Stop(); + cli(); + buzzer.tone(NTD1,300); + sei(); + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + rgb.setColor(0,0,0); + rgb.setColor(10,10,10); + rgb.show(); + break; + case IR_BUTTON_B: + controlflag = IR_CONTROLER; + moveSpeed = 200; + mode = MODE_B; + Stop(); + cli(); + buzzer.tone(NTD2,300); + sei(); + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + rgb.setColor(0,0,0); + rgb.setColor(0,10,0); + rgb.show(); + break; + case IR_BUTTON_C: + controlflag = IR_CONTROLER; + moveSpeed = 200; + mode = MODE_C; + Stop(); + cli(); + buzzer.tone(NTD3,300); + sei(); + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + rgb.setColor(0,0,0); + rgb.setColor(0,0,10); + rgb.show(); + break; + case IR_BUTTON_PLUS: + controlflag = IR_CONTROLER; + if(mode == MODE_A) + { + motor_sta = RUN_F; + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + rgb.setColor(0,0,0); + rgb.setColor(10,10,0); + rgb.show(); + } + break; + case IR_BUTTON_MINUS: + controlflag = IR_CONTROLER; + if(mode == MODE_A) + { + motor_sta = RUN_B; + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + rgb.setColor(0,0,0); + rgb.setColor(10,0,0); + rgb.show(); + } + break; + case IR_BUTTON_NEXT: + controlflag = IR_CONTROLER; + if(mode == MODE_A) + { + motor_sta = RUN_R; + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + rgb.setColor(0,0,0); + rgb.setColor(1,10,10,0); + rgb.show(); + } + break; + case IR_BUTTON_PREVIOUS: + controlflag = IR_CONTROLER; + if(mode == MODE_A) + { + motor_sta = RUN_L; + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + rgb.setColor(0,0,0); + rgb.setColor(2,10,10,0); + rgb.show(); + } + break; + case IR_BUTTON_9: + controlflag = IR_CONTROLER; + cli(); + buzzer.tone(NTDH2, 300); + sei(); + ChangeSpeed(factor * 9 + minSpeed); + break; + case IR_BUTTON_8: + controlflag = IR_CONTROLER; + cli(); + buzzer.tone(NTDH1, 300); + sei(); + ChangeSpeed(factor * 9 + minSpeed); + break; + case IR_BUTTON_7: + controlflag = IR_CONTROLER; + cli(); + buzzer.tone(NTD7, 300); + sei(); + ChangeSpeed(factor * 9 + minSpeed); + break; + case IR_BUTTON_6: + controlflag = IR_CONTROLER; + cli(); + buzzer.tone(NTD6, 300); + sei(); + ChangeSpeed(factor * 6 + minSpeed); + break; + case IR_BUTTON_5: + controlflag = IR_CONTROLER; + cli(); + buzzer.tone(NTD5, 300); + sei(); + ChangeSpeed(factor * 6 + minSpeed); + break; + case IR_BUTTON_4: + controlflag = IR_CONTROLER; + cli(); + buzzer.tone(NTD4, 300); + sei(); + ChangeSpeed(factor * 6 + minSpeed); + break; + case IR_BUTTON_3: + controlflag = IR_CONTROLER; + cli(); + buzzer.tone(NTD3, 300); + sei(); + ChangeSpeed(factor * 3 + minSpeed); + break; + case IR_BUTTON_2: + controlflag = IR_CONTROLER; + cli(); + buzzer.tone(NTD2, 300); + sei(); + ChangeSpeed(factor * 3 + minSpeed); + break; + case IR_BUTTON_1: + controlflag = IR_CONTROLER; + cli(); + buzzer.tone(NTD1, 300); + sei(); + ChangeSpeed(factor * 3 + minSpeed); + break; + } + } + else if((controlflag == IR_CONTROLER) && ((millis() - time) > 120)) + { + motor_sta = STOP; + time = millis(); + if(mode == MODE_A ) + { + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + rgb.setColor(10, 10, 10); + rgb.show(); + } + else if(mode == MODE_B ) + { + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + rgb.setColor(0, 10, 0); + rgb.show(); + } + else if(mode == MODE_C) + { + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + rgb.setColor(0, 0, 10); + rgb.show(); + } + } +} + +void Forward() +{ + MotorL.run(-moveSpeed); + MotorR.run(moveSpeed); +} + +void Backward() +{ + MotorL.run(moveSpeed); + MotorR.run(-moveSpeed); +} + +void TurnLeft() +{ + MotorL.run(moveSpeed*0.8); + MotorR.run(moveSpeed*0.8); +} + +void TurnRight() +{ + MotorL.run(-moveSpeed*0.8); + MotorR.run(-moveSpeed*0.8); +} + +void TurnLeft2() +{ + MotorL.run(-moveSpeed/5); + MotorR.run(moveSpeed); +} + +void TurnRight2() +{ + MotorL.run(-moveSpeed); + MotorR.run(moveSpeed/5); +} + +void BackwardAndTurnLeft() +{ + MotorL.run(moveSpeed/3 ); + MotorR.run(-moveSpeed); +} + +void BackwardAndTurnRight() +{ + MotorL.run(moveSpeed); + MotorR.run(-moveSpeed/3); +} + +void Stop() +{ + rgb.setColor(0,0,0); + rgb.show(); + MotorL.run(0); + MotorR.run(0); +} + +uint8_t prevState = 0; +void ChangeSpeed(int spd) +{ + moveSpeed = spd; +} + +void modeA() +{ + switch (motor_sta) + { + case RUN_F: + Forward(); + prevState = motor_sta; + break; + case RUN_B: + Backward(); + prevState = motor_sta; + break; + case RUN_L: + TurnLeft(); + prevState = motor_sta; + break; + case RUN_R: + TurnRight(); + prevState = motor_sta; + break; + case STOP: + if(prevState != motor_sta) + { + prevState = motor_sta; + Stop(); + } + break; + } +} + +void modeB() +{ + uint8_t d = ultr.distanceCm(70); + static long time = millis(); + randomSeed(analogRead(6)); + uint8_t randNumber = random(2); + if((d > high) || (d == 0)) + { + Forward(); + } + else if((d > low) && (d < high)) + { + switch (randNumber) + { + case 0: + TurnLeft(); + delay(300); + break; + case 1: + TurnRight(); + delay(300); + break; + } + } + else + { + switch (randNumber) + { + case 0: + TurnLeft(); + delay(800); + break; + case 1: + TurnRight(); + delay(800); + break; + } + } + delay(100); +} + +void modeC() +{ + uint8_t val; + val = line.readSensors(); + if(moveSpeed > 230) + { + moveSpeed=230; + } + switch(val) + { + case S1_IN_S2_IN: + Forward(); + LineFollowFlag = 10; + break; + + case S1_IN_S2_OUT: + Forward(); + if (LineFollowFlag > 1) + { + LineFollowFlag--; + } + break; + + case S1_OUT_S2_IN: + Forward(); + if (LineFollowFlag<20) + { + LineFollowFlag++; + } + break; + + case S1_OUT_S2_OUT: + if(LineFollowFlag == 10) + { + Backward(); + } + if(LineFollowFlag < 10) + { + TurnLeft2(); + } + if(LineFollowFlag > 10) + { + TurnRight2(); + } + break; + } +} + +void parseData() +{ + isStart = false; + int idx = readBuffer(3); + command_index = (uint8_t)idx; + int action = readBuffer(4); + int device = readBuffer(5); + switch(action) + { + case GET: + { + if(device != ULTRASONIC_SENSOR) + { + writeHead(); + writeSerial(idx); + } + readSensor(device); + writeEnd(); + } + break; + case RUN: + { + runModule(device); + callOK(); + } + break; + case RESET: + { + //reset + MotorL.run(0); + MotorR.run(0); + buzzerOff(); + callOK(); + } + break; + case START: + { + //start + callOK(); + } + break; + } +} + +void callOK() +{ + writeSerial(0xff); + writeSerial(0x55); + writeEnd(); +} + +void sendByte(char c) +{ + writeSerial(1); + writeSerial(c); +} + +void sendString(String s) +{ + int l = s.length(); + writeSerial(4); + writeSerial(l); + for(int i=0;i15) + { + break; + } + _receiveUint8[i] = readBuffer(idx+i); + } + return _receiveUint8; +} + + +void runModule(int device) +{ + //0xff 0x55 0x6 0x0 0x2 0x22 0x9 0x0 0x0 0xa + int port = readBuffer(6); + int pin = port; + switch(device) + { + case MOTOR: + { + controlflag = BLUE_TOOTH; + int16_t speed = readShort(7); + port==M1?MotorL.run(speed):MotorR.run(speed); + } + break; + case JOYSTICK: + { + controlflag = BLUE_TOOTH; + int16_t leftSpeed = readShort(6); + MotorL.run(leftSpeed); + int16_t rightSpeed = readShort(8); + MotorR.run(rightSpeed); + } + break; + case RGBLED: + { + controlflag = BLUE_TOOTH; + int16_t slot = readBuffer(7); + int16_t idx = readBuffer(8); + int16_t r = readBuffer(9); + int16_t g = readBuffer(10); + int16_t b = readBuffer(11); + + if((rgb.getPort() != port) || rgb.getSlot() != slot) + { + rgb.reset(port,slot); + } + if(idx > 0) + { + rgb.setColorAt(idx-1,r,g,b); + } + else + { + rgb.setColor(r,g,b); + } + rgb.show(); + } + break; + case SERVO: + { + int16_t slot = readBuffer(7); + pin = slot == 1?mePort[port].s1:mePort[port].s2; + int16_t v = readBuffer(8); + if((v >= 0) && (v <= 180)) + { + servo.attach(pin); + servo.write(v); + } + } + break; + case SEVSEG: + { + if(seg.getPort() != port) + { + seg.reset(port); + } + float v = readFloat(7); + seg.display(v); + } + break; + case LEDMATRIX: + { + if(ledMx.getPort() != port) + { + ledMx.reset(port); + } + int16_t action = readBuffer(7); + if(action == 1) + { + int16_t px = readBuffer(8); + int16_t py = readBuffer(9); + int16_t len = readBuffer(10); + char *s = readString(11,len); + ledMx.drawStr(px,py,s); + } + else if(action == 2) + { + int16_t px = readBuffer(8); + int16_t py = readBuffer(9); + uint8_t *ss = readUint8(10,16); + ledMx.drawBitmap(px,py,16,ss); + } + else if(action == 3) + { + int16_t point = readBuffer(8); + int16_t hours = readBuffer(9); + int16_t minutes = readBuffer(10); + ledMx.showClock(hours,minutes,point); + } + else if(action == 4) + { + ledMx.showNum(readFloat(8),3); + } + } + break; + case LIGHT_SENSOR: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + } + int16_t v = readBuffer(7); + generalDevice.dWrite1(v); + } + break; + case IR: + { + String Str_data; + int16_t len = readBuffer(2) - 3; + for(int16_t i=0;i 0) + { + buzzer.tone(hz,tone_time); + } + else + { + buzzer.noTone(); + } + } + break; + case SERVO_PIN: + { + int v = readBuffer(7); + if((v >= 0) && (v <= 180)) + { + servo.attach(pin); + servo.write(v); + } + } + break; + case TIMER: + { + lastTime = millis()/1000.0; + } + break; + } +} +void readSensor(int device) +{ + /************************************************** + ff 55 len idx action device port slot data a + 0 1 2 3 4 5 6 7 8 + 0xff 0x55 0x4 0x3 0x1 0x1 0x1 0xa + ***************************************************/ + float value=0.0; + int port,slot,pin; + port = readBuffer(6); + pin = port; + switch(device) + { + case ULTRASONIC_SENSOR: + { + if(ultr.getPort() != port) + { + ultr.reset(port); + } + value = (float)ultr.distanceCm(); + writeHead(); + writeSerial(command_index); + sendFloat(value); + } + break; + case TEMPERATURE_SENSOR: + { + slot = readBuffer(7); + if((ts.getPort() != port) || (ts.getSlot() != slot)) + { + ts.reset(port,slot); + } + value = ts.temperature(); + sendFloat(value); + } + break; + case LIGHT_SENSOR: + case SOUND_SENSOR: + case POTENTIONMETER: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.aRead2(); + sendFloat(value); + } + break; + case JOYSTICK: + { + slot = readBuffer(7); + if(joystick.getPort() != port) + { + joystick.reset(port); + } + value = joystick.read(slot); + sendFloat(value); + } + break; + case IR: + { +// if(ir.getPort() != port) +// { +// ir.reset(port); +// } +// if(irReady) +// { +// sendString(irBuffer); +// irReady = false; +// irBuffer = ""; +// } + } + break; + case IRREMOTE: + { +// unsigned char r = readBuffer(7); +// if((millis()/1000.0 - lastIRTime) > 0.2) +// { +// sendByte(0); +// } +// else +// { +// sendByte(irRead == r); +// } +// irRead = 0; +// irIndex = 0; + } + break; + case IRREMOTECODE: + { +// sendByte(irRead); +// irRead = 0; +// irIndex = 0; + } + break; + case PIRMOTION: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead2(); + sendFloat(value); + } + break; + case LINEFOLLOWER: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + pinMode(generalDevice.pin1(),INPUT); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead1()*2 + generalDevice.dRead2(); + sendFloat(value); + } + break; + case LIMITSWITCH: + { + slot = readBuffer(7); + if((generalDevice.getPort() != port) || (generalDevice.getSlot() != slot)) + { + generalDevice.reset(port,slot); + } + if(slot == 1) + { + pinMode(generalDevice.pin1(),INPUT_PULLUP); + value = !generalDevice.dRead1(); + } + else + { + pinMode(generalDevice.pin2(),INPUT_PULLUP); + value = !generalDevice.dRead2(); + } + sendFloat(value); + } + break; + case BUTTON_INNER: + { + pin = analogs[pin]; + char s = readBuffer(7); + pinMode(pin,INPUT); + boolean currentPressed = !(analogRead(pin)>10); + sendByte(s^(currentPressed?1:0)); + buttonPressed = currentPressed; + } + break; + case GYRO: + { +// int axis = readBuffer(7); +// gyro.update(); +// if(axis == 1) +// { +// value = gyro.getAngleX(); +// sendFloat(value); +// } +// else if(axis == 2) +// { +// value = gyro.getAngleY(); +// sendFloat(value); +// } +// else if(axis == 3) +// { +// value = gyro.getAngleZ(); +// sendFloat(value); +// } + } + break; + case VERSION: + { + sendString(mVersion); + } + break; + case DIGITAL: + { + pinMode(pin,INPUT); + sendFloat(digitalRead(pin)); + } + break; + case ANALOG: + { + pin = analogs[pin]; + pinMode(pin,INPUT); + sendFloat(analogRead(pin)); + } + break; + case TIMER: + { + sendFloat(currentTime); + } + break; + } +} + +void setup() +{ + delay(5); + Stop(); + pinMode(13,OUTPUT); + pinMode(7,INPUT); + digitalWrite(13,HIGH); + delay(300); + digitalWrite(13,LOW); + rgb.reset(PORT_7,SLOT2); + rgb.setColor(0,0,0); + rgb.show(); + delay(1); + rgb.setColor(10, 0, 0); + rgb.show(); + buzzer.tone(NTD1, 300); + delay(300); + rgb.setColor(0, 10, 0); + rgb.show(); + buzzer.tone(NTD2, 300); + delay(300); + rgb.setColor(0, 0, 10); + rgb.show(); + buzzer.tone(NTD3, 300); + delay(300); + rgb.setColor(10,10,10); + rgb.show(); + Serial.begin(115200); + buzzer.noTone(); + ir.begin(); + Serial.print("Version: "); + Serial.println(mVersion); + ledMx.setBrightness(6); + ledMx.setColorIndex(1); +} + +void loop() +{ + while(1) + { + get_ir_command(); + serialHandle(); + currentPressed = !(analogRead(7) > 100); + if(currentPressed != pre_buttonPressed) + { + if((rgb.getPort() != PORT_7) || rgb.getSlot() != SLOT2) + { + rgb.reset(PORT_7,SLOT2);; + } + pre_buttonPressed = currentPressed; + if(currentPressed == true) + { + if(mode == MODE_A) + { + mode = MODE_B; + moveSpeed = 200; + Stop(); + cli(); + buzzer.tone(NTD2, 300); + sei(); + buzzer.noTone(); + rgb.setColor(0,0,0); + rgb.setColor(0, 10, 0); + rgb.show(); + } + else if(mode == MODE_B) + { + mode = MODE_C; + moveSpeed = 200; + Stop(); + cli(); + buzzer.tone(NTD2, 300); + sei(); + buzzer.noTone(); + rgb.setColor(0,0,0); + rgb.setColor(0, 0, 10); + rgb.show(); + } + else if(mode == MODE_C) + { + mode = MODE_A; + moveSpeed = 220; + Stop(); + cli(); + buzzer.tone(NTD1, 300); + sei(); + buzzer.noTone(); + rgb.setColor(0,0,0); + rgb.setColor(10, 10, 10); + rgb.show(); + } + } + } + switch (mode) + { + case MODE_A: + modeA(); + break; + case MODE_B: + modeB(); + break; + case MODE_C: + modeC(); + break; + } + } +} + diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/mbot_firmware/mbot_firmware.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/mbot_firmware/mbot_firmware.ino new file mode 100644 index 0000000..0334e05 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/mbot_firmware/mbot_firmware.ino @@ -0,0 +1,815 @@ +/************************************************************************* +* File Name : mbot_firmware.ino +* Author : Ander, Mark Yan +* Updated : Ander, Mark Yan +* Version : V06.01.107 +* Date : 01/03/2017 +* Description : Firmware for Makeblock Electronic modules with Scratch. +* License : CC-BY-SA 3.0 +* Copyright (C) 2013 - 2016 Maker Works Technology Co., Ltd. All right reserved. +* http://www.makeblock.cc/ +**************************************************************************/ +#include +#include + +Servo servos[8]; +MeDCMotor dc; +MeTemperature ts; +MeRGBLed led(0,30); +MeUltrasonicSensor us; +Me7SegmentDisplay seg; +MePort generalDevice; +MeLEDMatrix ledMx; +MeBuzzer buzzer; +MeIR ir; +MeGyro gyro; +MeJoystick joystick; +MeCompass Compass; +MeHumiture humiture; +MeFlameSensor FlameSensor; +MeGasSensor GasSensor; +MeTouchSensor touchSensor; +Me4Button buttonSensor; + +typedef struct MeModule +{ + int device; + int port; + int slot; + int pin; + int index; + float values[3]; +} MeModule; + +union{ + byte byteVal[4]; + float floatVal; + long longVal; +}val; + +union{ + byte byteVal[8]; + double doubleVal; +}valDouble; + +union{ + byte byteVal[2]; + short shortVal; +}valShort; + +#if defined(__AVR_ATmega32U4__) +const int analogs[12] PROGMEM = {A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11}; +#else +const int analogs[8] PROGMEM = {A0,A1,A2,A3,A4,A5,A6,A7}; +#endif +String mVersion = "06.01.107"; +boolean isAvailable = false; + +int len = 52; +char buffer[52]; +byte index = 0; +byte dataLen; +byte modulesLen=0; +boolean isStart = false; +char serialRead; +uint8_t command_index = 0; +int irDelay = 0; +int irIndex = 0; +char irRead = 0; +boolean irReady = false; +String irBuffer = ""; +double lastTime = 0.0; +double currentTime = 0.0; +double lastIRTime = 0.0; + +#define VERSION 0 +#define ULTRASONIC_SENSOR 1 +#define TEMPERATURE_SENSOR 2 +#define LIGHT_SENSOR 3 +#define POTENTIONMETER 4 +#define JOYSTICK 5 +#define GYRO 6 +#define SOUND_SENSOR 7 +#define RGBLED 8 +#define SEVSEG 9 +#define MOTOR 10 +#define SERVO 11 +#define ENCODER 12 +#define IR 13 +#define IRREMOTE 14 +#define PIRMOTION 15 +#define INFRARED 16 +#define LINEFOLLOWER 17 +#define IRREMOTECODE 18 +#define SHUTTER 20 +#define LIMITSWITCH 21 +#define BUTTON 22 +#define HUMITURE 23 +#define FLAMESENSOR 24 +#define GASSENSOR 25 +#define COMPASS 26 +#define TEMPERATURE_SENSOR_1 27 +#define DIGITAL 30 +#define ANALOG 31 +#define PWM 32 +#define SERVO_PIN 33 +#define TONE 34 +#define BUTTON_INNER 35 +#define ULTRASONIC_ARDUINO 36 +#define PULSEIN 37 +#define STEPPER 40 +#define LEDMATRIX 41 +#define TIMER 50 +#define TOUCH_SENSOR 51 +#define JOYSTICK_MOVE 52 +#define COMMON_COMMONCMD 60 + //Secondary command + #define SET_STARTER_MODE 0x10 + #define SET_AURIGA_MODE 0x11 + #define SET_MEGAPI_MODE 0x12 + #define GET_BATTERY_POWER 0x70 + #define GET_AURIGA_MODE 0x71 + #define GET_MEGAPI_MODE 0x72 +#define ENCODER_BOARD 61 + //Read type + #define ENCODER_BOARD_POS 0x01 + #define ENCODER_BOARD_SPEED 0x02 + +#define ENCODER_PID_MOTION 62 + //Secondary command + #define ENCODER_BOARD_POS_MOTION 0x01 + #define ENCODER_BOARD_SPEED_MOTION 0x02 + #define ENCODER_BOARD_PWM_MOTION 0x03 + #define ENCODER_BOARD_SET_CUR_POS_ZERO 0x04 + #define ENCODER_BOARD_CAR_POS_MOTION 0x05 + +#define PM25SENSOR 63 + //Secondary command + #define GET_PM1_0 0x01 + #define GET_PM2_5 0x02 + #define GET_PM10 0x03 + +#define GET 1 +#define RUN 2 +#define RESET 4 +#define START 5 +float angleServo = 90.0; +int servo_pins[8]={0,0,0,0,0,0,0,0}; +unsigned char prevc=0; +boolean buttonPressed = false; +uint8_t keyPressed = KEY_NULL; + +/* + * function list + */ + void readButtonInner(uint8_t pin, int8_t s); + void buzzerOn(); + void buzzerOff(); + unsigned char readBuffer(int index); + void writeBuffer(int index,unsigned char c); + void writeHead(); + void writeEnd(); + void writeSerial(unsigned char c); + void readSerial(); + void parseData(); + void callOK(); + void sendByte(char c); + void sendString(String s); + void sendFloat(float value); + void sendShort(double value); + void sendDouble(double value); + short readShort(int idx); + float readFloat(int idx); + char* readString(int idx,int len); + uint8_t* readUint8(int idx,int len); + void runModule(int device); + int searchServoPin(int pin); + void readSensor(int device); + + +void readButtonInner(uint8_t pin, int8_t s) +{ + pin = pgm_read_byte(&analogs[pin]); + pinMode(pin,INPUT); + boolean currentPressed = !(analogRead(pin)>10); + + if(buttonPressed == currentPressed){ + return; + } + buttonPressed = currentPressed; + writeHead(); + writeSerial(0x80); + sendByte(currentPressed); + writeEnd(); +} + +void buzzerOn(){ + buzzer.tone(500,1000); +} +void buzzerOff(){ + buzzer.noTone(); +} +unsigned char readBuffer(int index){ + return buffer[index]; +} +void writeBuffer(int index,unsigned char c){ + buffer[index]=c; +} +void writeHead(){ + writeSerial(0xff); + writeSerial(0x55); +} +void writeEnd(){ + Serial.println(); +} +void writeSerial(unsigned char c){ + Serial.write(c); +} +void readSerial(){ + isAvailable = false; + if(Serial.available()>0){ + isAvailable = true; + serialRead = Serial.read(); + } +} +/* +ff 55 len idx action device port slot data a +0 1 2 3 4 5 6 7 8 +*/ +void parseData(){ + isStart = false; + int idx = readBuffer(3); + command_index = (uint8_t)idx; + int action = readBuffer(4); + int device = readBuffer(5); + switch(action){ + case GET:{ + if(device != ULTRASONIC_SENSOR){ + writeHead(); + writeSerial(idx); + } + readSensor(device); + writeEnd(); + } + break; + case RUN:{ + runModule(device); + callOK(); + } + break; + case RESET:{ + //reset + dc.reset(M1); + dc.run(0); + dc.reset(M2); + dc.run(0); + buzzerOff(); + callOK(); + } + break; + case START:{ + //start + callOK(); + } + break; + } +} +void callOK(){ + writeSerial(0xff); + writeSerial(0x55); + writeEnd(); +} +void sendByte(char c){ + writeSerial(1); + writeSerial(c); +} +void sendString(String s){ + int l = s.length(); + writeSerial(4); + writeSerial(l); + for(int i=0;i15){ + break; + } + _receiveUint8[i] = readBuffer(idx+i); + } + return _receiveUint8; +} +void runModule(int device){ + //0xff 0x55 0x6 0x0 0x2 0x22 0x9 0x0 0x0 0xa + int port = readBuffer(6); + int pin = port; + switch(device){ + case MOTOR:{ + int speed = readShort(7); + if(dc.getPort()!=port){ + dc.reset(port); + } + dc.run(speed); + } + break; + case JOYSTICK:{ + int leftSpeed = readShort(6); + dc.reset(M1); + dc.run(leftSpeed); + int rightSpeed = readShort(8); + dc.reset(M2); + dc.run(rightSpeed); + } + break; + case RGBLED:{ + int slot = readBuffer(7); + int idx = readBuffer(8); + int r = readBuffer(9); + int g = readBuffer(10); + int b = readBuffer(11); + if((led.getPort() != port) || led.getSlot() != slot) + { + led.reset(port,slot); + } + if(idx>0) + { + led.setColorAt(idx-1,r,g,b); + } + else + { + led.setColor(r,g,b); + } + led.show(); + } + break; + case SERVO:{ + int slot = readBuffer(7); + pin = slot==1?mePort[port].s1:mePort[port].s2; + int v = readBuffer(8); + Servo sv = servos[searchServoPin(pin)]; + if(v >= 0 && v <= 180) + { + if(!sv.attached()) + { + sv.attach(pin); + } + sv.write(v); + } + } + break; + case SEVSEG:{ + if(seg.getPort()!=port){ + seg.reset(port); + } + float v = readFloat(7); + seg.display(v); + } + break; + case LEDMATRIX:{ + if(ledMx.getPort()!=port){ + ledMx.reset(port); + } + int action = readBuffer(7); + if(action==1){ + int px = buffer[8]; + int py = buffer[9]; + int len = readBuffer(10); + char *s = readString(11,len); + ledMx.drawStr(px,py,s); + }else if(action==2){ + int px = readBuffer(8); + int py = readBuffer(9); + uint8_t *ss = readUint8(10,16); + ledMx.drawBitmap(px,py,16,ss); + }else if(action==3){ + int point = readBuffer(8); + int hours = readBuffer(9); + int minutes = readBuffer(10); + ledMx.showClock(hours,minutes,point); + }else if(action == 4){ + ledMx.showNum(readFloat(8),3); + } + } + break; + case LIGHT_SENSOR:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + } + int v = readBuffer(7); + generalDevice.dWrite1(v); + } + break; + case IR:{ + String Str_data; + int len = readBuffer(2)-3; + for(int i=0;i0){ + buzzer.tone(hz,tone_time); + }else{ + buzzer.noTone(); + } + } + break; + case SERVO_PIN:{ + int v = readBuffer(7); + Servo sv = servos[searchServoPin(pin)]; + if(v >= 0 && v <= 180) + { + if(!sv.attached()) + { + sv.attach(pin); + } + sv.write(v); + } + } + break; + case TIMER:{ + lastTime = millis()/1000.0; + } + break; + } +} + +int searchServoPin(int pin){ + for(int i=0;i<8;i++){ + if(servo_pins[i] == pin){ + return i; + } + if(servo_pins[i]==0){ + servo_pins[i] = pin; + return i; + } + } + return 0; +} +void readSensor(int device){ + /************************************************** + ff 55 len idx action device port slot data a + 0 1 2 3 4 5 6 7 8 + 0xff 0x55 0x4 0x3 0x1 0x1 0x1 0xa + ***************************************************/ + float value=0.0; + int port,slot,pin; + port = readBuffer(6); + pin = port; + switch(device){ + case ULTRASONIC_SENSOR:{ + if(us.getPort()!=port){ + us.reset(port); + } + value = (float)us.distanceCm(); + writeHead(); + writeSerial(command_index); + sendFloat(value); + } + break; + case TEMPERATURE_SENSOR:{ + slot = readBuffer(7); + if(ts.getPort()!=port||ts.getSlot()!=slot){ + ts.reset(port,slot); + } + value = ts.temperature(); + sendFloat(value); + } + break; + case LIGHT_SENSOR: + case SOUND_SENSOR: + case POTENTIONMETER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.aRead2(); + sendFloat(value); + } + break; + case JOYSTICK:{ + slot = readBuffer(7); + if(joystick.getPort() != port){ + joystick.reset(port); + } + value = joystick.read(slot); + sendFloat(value); + } + break; + case IR:{ + if(irReady){ + sendString(irBuffer); + irReady = false; + irBuffer = ""; + } + } + break; + case IRREMOTE:{ + unsigned char r = readBuffer(7); + if(millis()/1000.0-lastIRTime>0.2){ + sendByte(0); + }else{ + sendByte(irRead==r); + } + //irRead = 0; + irIndex = 0; + } + break; + case IRREMOTECODE:{ + if(irRead<0xff){ + sendByte(irRead); + } + irRead = 0; + irIndex = 0; + } + break; + case PIRMOTION:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead2(); + sendFloat(value); + } + break; + case LINEFOLLOWER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin1(),INPUT); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead1()*2+generalDevice.dRead2(); + sendFloat(value); + } + break; + case LIMITSWITCH:{ + slot = readBuffer(7); + if(generalDevice.getPort()!=port||generalDevice.getSlot()!=slot){ + generalDevice.reset(port,slot); + } + if(slot==1){ + pinMode(generalDevice.pin1(),INPUT_PULLUP); + value = !generalDevice.dRead1(); + }else{ + pinMode(generalDevice.pin2(),INPUT_PULLUP); + value = !generalDevice.dRead2(); + } + sendFloat(value); + } + break; + case BUTTON_INNER:{ + //pin = analogs[pin]; + pin = pgm_read_byte(&analogs[pin]); + char s = readBuffer(7); + pinMode(pin,INPUT); + boolean currentPressed = !(analogRead(pin)>10); + sendByte(s^(currentPressed?1:0)); + buttonPressed = currentPressed; + } + break; + case COMPASS:{ + if(Compass.getPort()!=port){ + Compass.reset(port); + Compass.setpin(Compass.pin1(),Compass.pin2()); + } + sendFloat(Compass.getAngle()); + } + break; + case HUMITURE:{ + uint8_t index = readBuffer(7); + if(humiture.getPort()!=port){ + humiture.reset(port); + } + uint8_t HumitureData; + humiture.update(); + HumitureData = humiture.getValue(index); + sendByte(HumitureData); + } + break; + case FLAMESENSOR:{ + if(FlameSensor.getPort()!=port){ + FlameSensor.reset(port); + FlameSensor.setpin(FlameSensor.pin2(),FlameSensor.pin1()); + } + int16_t FlameData; + FlameData = FlameSensor.readAnalog(); + sendShort(FlameData); + } + break; + case GASSENSOR:{ + if(GasSensor.getPort()!=port){ + GasSensor.reset(port); + GasSensor.setpin(GasSensor.pin2(),GasSensor.pin1()); + } + int16_t GasData; + GasData = GasSensor.readAnalog(); + sendShort(GasData); + } + break; + case GYRO:{ + int axis = readBuffer(7); + gyro.update(); + value = gyro.getAngle(axis); + sendFloat(value); + } + break; + case VERSION:{ + sendString(mVersion); + } + break; + case DIGITAL:{ + pinMode(pin,INPUT); + sendFloat(digitalRead(pin)); + } + break; + case ANALOG:{ + //pin = analogs[pin]; + pin = pgm_read_byte(&analogs[pin]); + pinMode(pin,INPUT); + sendFloat(analogRead(pin)); + } + break; + case TIMER:{ + sendFloat(currentTime); + } + break; + case TOUCH_SENSOR: + { + if(touchSensor.getPort() != port){ + touchSensor.reset(port); + } + sendByte(touchSensor.touched()); + } + break; + case BUTTON: + { + if(buttonSensor.getPort() != port){ + buttonSensor.reset(port); + } + sendByte(keyPressed == readBuffer(7)); + } + break; + } +} + +void setup(){ + pinMode(13,OUTPUT); + digitalWrite(13,HIGH); + delay(300); + digitalWrite(13,LOW); + Serial.begin(115200); + delay(500); + buzzer.tone(500,50); + delay(50); + buzzerOff(); + ir.begin(); + led.setpin(13); + led.setColor(0,0,0); + led.show(); + gyro.begin(); + Serial.print("Version: "); + Serial.println(mVersion); + ledMx.setBrightness(6); + ledMx.setColorIndex(1); +} + +void loop(){ + readButtonInner(7,0); + keyPressed = buttonSensor.pressed(); + currentTime = millis()/1000.0-lastTime; + if(ir.decode()) + { + irRead = ((ir.value>>8)>>8)&0xff; + lastIRTime = millis()/1000.0; + if(irRead==0xa||irRead==0xd){ + irIndex = 0; + irReady = true; + }else{ + irBuffer+=irRead; + irIndex++; + if(irIndex>64){ + irIndex = 0; + irBuffer = ""; + } + } + irDelay = 0; + }else{ + irDelay++; + if(irRead>0){ + if(irDelay>5000){ + irRead = 0; + irDelay = 0; + } + } + } + readSerial(); + if(isAvailable){ + unsigned char c = serialRead&0xff; + if(c==0x55&&isStart==false){ + if(prevc==0xff){ + index=1; + isStart = true; + } + }else{ + prevc = c; + if(isStart){ + if(index==2){ + dataLen = c; + }else if(index>2){ + dataLen--; + } + writeBuffer(index,c); + } + } + index++; + if(index>51){ + index=0; + isStart=false; + } + if(isStart&&dataLen==0&&index>3){ + isStart = false; + parseData(); + index=0; + } + } +} diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/mega2560_firmware/mega2560_firmware.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/mega2560_firmware/mega2560_firmware.ino new file mode 100644 index 0000000..84aecc5 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/mega2560_firmware/mega2560_firmware.ino @@ -0,0 +1,731 @@ +/************************************************************************* +* File Name : mega2560_firmware.ino +* Author : Ander, Mark Yan +* Updated : Ander, Mark Yan +* Version : V0d.01.105 +* Date : 07/06/2016 +* Description : Firmware for Makeblock Electronic modules with Scratch. +* License : CC-BY-SA 3.0 +* Copyright (C) 2013 - 2016 Maker Works Technology Co., Ltd. All right reserved. +* http://www.makeblock.cc/ +**************************************************************************/ +#include +#include +#include +#include + +Servo servos[8]; +MeDCMotor dc; +MeTemperature ts; +MeRGBLed led; +MeUltrasonicSensor us; +Me7SegmentDisplay seg; +MePort generalDevice; +MeInfraredReceiver *ir = NULL; +MeGyro gyro; +MeJoystick joystick; +MeStepper steppers[2]; +MeBuzzer buzzer; +MeHumiture humiture; +MeFlameSensor FlameSensor; +MeGasSensor GasSensor; +MeTouchSensor touchSensor; +Me4Button buttonSensor; + +typedef struct MeModule +{ + int device; + int port; + int slot; + int pin; + int index; + float values[3]; +} MeModule; + +union{ + byte byteVal[4]; + float floatVal; + long longVal; +}val; + +union{ + byte byteVal[8]; + double doubleVal; +}valDouble; + +union{ + byte byteVal[2]; + short shortVal; +}valShort; +MeModule modules[12]; +#if defined(__AVR_ATmega32U4__) + int analogs[12]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11}; +#endif +#if defined(__AVR_ATmega328P__) or defined(__AVR_ATmega168__) + int analogs[8]={A0,A1,A2,A3,A4,A5,A6,A7}; + MeEncoderMotor encoders[2]; +#endif +#if defined(__AVR_ATmega1280__)|| defined(__AVR_ATmega2560__) + int analogs[16]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15}; +#endif +String mVersion = "0d.01.105"; +boolean isAvailable = false; +boolean isBluetooth = false; + +int len = 52; +char buffer[52]; +char bufferBt[52]; +byte index = 0; +byte dataLen; +byte modulesLen=0; +boolean isStart = false; +unsigned char irRead; +char serialRead; +#define VERSION 0 +#define ULTRASONIC_SENSOR 1 +#define TEMPERATURE_SENSOR 2 +#define LIGHT_SENSOR 3 +#define POTENTIONMETER 4 +#define JOYSTICK 5 +#define GYRO 6 +#define SOUND_SENSOR 7 +#define RGBLED 8 +#define SEVSEG 9 +#define MOTOR 10 +#define SERVO 11 +#define ENCODER 12 +#define IR 13 +#define IRREMOTE 14 +#define PIRMOTION 15 +#define INFRARED 16 +#define LINEFOLLOWER 17 +#define IRREMOTECODE 18 +#define SHUTTER 20 +#define LIMITSWITCH 21 +#define BUTTON 22 +#define HUMITURE 23 +#define FLAMESENSOR 24 +#define GASSENSOR 25 +#define COMPASS 26 +#define DIGITAL 30 +#define ANALOG 31 +#define PWM 32 +#define SERVO_PIN 33 +#define TONE 34 +#define PULSEIN 37 +#define ULTRASONIC_ARDUINO 36 +#define STEPPER 40 +#define LEDMATRIX 41 +#define TIMER 50 +#define TOUCH_SENSOR 51 + +#define GET 1 +#define RUN 2 +#define RESET 4 +#define START 5 +float angleServo = 90.0; +int servo_pins[8]={0,0,0,0,0,0,0,0}; +unsigned char prevc=0; +double lastTime = 0.0; +double currentTime = 0.0; +uint8_t keyPressed = 0; +uint8_t command_index = 0; + +void setup(){ + pinMode(13,OUTPUT); + digitalWrite(13,HIGH); + delay(300); + digitalWrite(13,LOW); + Serial.begin(115200); + delay(500); + buzzerOn(); + delay(100); + buzzerOff(); + #if defined(__AVR_ATmega328P__) or defined(__AVR_ATmega168__) + encoders[0] = MeEncoderMotor(SLOT_1); + encoders[1] = MeEncoderMotor(SLOT_2); + encoders[0].begin(); + encoders[1].begin(); + delay(500); + encoders[0].runSpeed(0); + encoders[1].runSpeed(0); + #else + Serial1.begin(115200); + #endif + gyro.begin(); + Serial.print("Version: "); + Serial.println(mVersion); +} +void loop(){ + keyPressed = buttonSensor.pressed(); + currentTime = millis()/1000.0-lastTime; + if(ir != NULL) + { + ir->loop(); + } + readSerial(); + steppers[0].runSpeedToPosition(); + steppers[1].runSpeedToPosition(); + if(isAvailable){ + unsigned char c = serialRead&0xff; + if(c==0x55&&isStart==false){ + if(prevc==0xff){ + index=1; + isStart = true; + } + }else{ + prevc = c; + if(isStart){ + if(index==2){ + dataLen = c; + }else if(index>2){ + dataLen--; + } + writeBuffer(index,c); + } + } + index++; + if(index>51){ + index=0; + isStart=false; + } + if(isStart&&dataLen==0&&index>3){ + isStart = false; + parseData(); + index=0; + } + } +} +unsigned char readBuffer(int index){ + return isBluetooth?bufferBt[index]:buffer[index]; +} +void writeBuffer(int index,unsigned char c){ + if(isBluetooth){ + bufferBt[index]=c; + }else{ + buffer[index]=c; + } +} +void writeHead(){ + writeSerial(0xff); + writeSerial(0x55); +} +void writeEnd(){ + Serial.println(); + #if defined(__AVR_ATmega32U4__) + Serial1.println(); + #endif +} +void writeSerial(unsigned char c){ + Serial.write(c); + #if defined(__AVR_ATmega32U4__) + Serial1.write(c); + #endif +} +void readSerial(){ + isAvailable = false; + if(Serial.available()>0){ + isAvailable = true; + isBluetooth = false; + serialRead = Serial.read(); + } +//#if defined(__AVR_ATmega32U4__) +// if(Serial1.available()>0){ +// isAvailable = true; +// isBluetooth = false; +// serialRead = Serial1.read(); +// } +// #endif +} +/* +ff 55 len idx action device port slot data a +0 1 2 3 4 5 6 7 8 +*/ +void parseData(){ + isStart = false; + int idx = readBuffer(3); + command_index = (uint8_t)idx; + int action = readBuffer(4); + int device = readBuffer(5); + switch(action){ + case GET:{ + if(device != ULTRASONIC_SENSOR){ + writeHead(); + writeSerial(idx); + } + readSensor(device); + writeEnd(); + } + break; + case RUN:{ + runModule(device); + callOK(); + } + break; + case RESET:{ + //reset + dc.reset(M1); + dc.run(0); + dc.reset(M2); + dc.run(0); + dc.reset(PORT_1); + dc.run(0); + dc.reset(PORT_2); + dc.run(0); + + #if defined(__AVR_ATmega328P__) + encoders[0].runSpeed(0); + encoders[1].runSpeed(0); + #endif + callOK(); + } + break; + case START:{ + //start + callOK(); + } + break; + } +} +void callOK(){ + writeSerial(0xff); + writeSerial(0x55); + writeEnd(); +} +void sendByte(char c){ + writeSerial(1); + writeSerial(c); +} +void sendString(String s){ + int l = s.length(); + writeSerial(4); + writeSerial(l); + for(int i=0;i0) + { + led.setColorAt(idx-1,r,g,b); + } + else + { + led.setColor(r,g,b); + } + led.show(); + } + break; + case SERVO:{ + int slot = readBuffer(7); + pin = slot==1?mePort[port].s1:mePort[port].s2; + int v = readBuffer(8); + Servo sv = servos[searchServoPin(pin)]; + if(v >= 0 && v <= 180) + { + if(!sv.attached()) + { + sv.attach(pin); + } + sv.write(v); + } + } + break; + case SEVSEG:{ + if(seg.getPort()!=port){ + seg.reset(port); + } + float v = readFloat(7); + seg.display(v); + } + break; + case LIGHT_SENSOR:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + } + int v = readBuffer(7); + generalDevice.dWrite1(v); + } + break; + case SHUTTER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + } + int v = readBuffer(7); + if(v<2){ + generalDevice.dWrite1(v); + }else{ + generalDevice.dWrite2(v-2); + } + } + break; + case DIGITAL:{ + pinMode(pin,OUTPUT); + int v = readBuffer(7); + digitalWrite(pin,v); + } + break; + case PWM:{ + pinMode(pin,OUTPUT); + int v = readBuffer(7); + analogWrite(pin,v); + } + break; + case TONE:{ + pinMode(pin,OUTPUT); + int hz = readShort(7); + int ms = readShort(9); + if(ms>0){ + buzzer.tone(pin, hz, ms); + }else{ + buzzer.noTone(pin); + } + } + break; + case SERVO_PIN:{ + int v = readBuffer(7); + Servo sv = servos[searchServoPin(pin)]; + if(v >= 0 && v <= 180) + { + if(!sv.attached()) + { + sv.attach(pin); + } + sv.write(v); + } + } + break; + case TIMER:{ + lastTime = millis()/1000.0; + } + break; + } +} + +int searchServoPin(int pin){ + for(int i=0;i<8;i++){ + if(servo_pins[i] == pin){ + return i; + } + if(servo_pins[i]==0){ + servo_pins[i] = pin; + return i; + } + } + return 0; +} +void readSensor(int device){ + /************************************************** + ff 55 len idx action device port slot data a + 0 1 2 3 4 5 6 7 8 + ***************************************************/ + float value=0.0; + int port,slot,pin; + port = readBuffer(6); + pin = port; + switch(device){ + case ULTRASONIC_SENSOR:{ + if(us.getPort()!=port){ + us.reset(port); + } + value = us.distanceCm(); + writeHead(); + writeSerial(command_index); + sendFloat(value); + } + break; + case TEMPERATURE_SENSOR:{ + slot = readBuffer(7); + if(ts.getPort()!=port||ts.getSlot()!=slot){ + ts.reset(port,slot); + } + value = ts.temperature(); + sendFloat(value); + } + break; + case LIGHT_SENSOR: + case SOUND_SENSOR: + case POTENTIONMETER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.aRead2(); + sendFloat(value); + } + break; + case JOYSTICK:{ + slot = readBuffer(7); + if(joystick.getPort() != port){ + joystick.reset(port); + } + value = joystick.read(slot); + sendFloat(value); + } + break; + case INFRARED: + { + if(ir == NULL) + { + ir = new MeInfraredReceiver(port); + ir->begin(); + } + else if(ir->getPort() != port) + { + delete ir; + ir = new MeInfraredReceiver(port); + ir->begin(); + } + irRead = ir->getCode(); + if((irRead < 255) && (irRead > 0)) + { + sendFloat((float)irRead); + } + else + { + sendFloat(0); + } + } + break; + case PIRMOTION:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead2(); + sendFloat(value); + } + break; + case LINEFOLLOWER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin1(),INPUT); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead1()*2+generalDevice.dRead2(); + sendFloat(value); + } + break; + case LIMITSWITCH:{ + slot = readBuffer(7); + if(generalDevice.getPort()!=port||generalDevice.getSlot()!=slot){ + generalDevice.reset(port,slot); + } + if(slot==1){ + pinMode(generalDevice.pin1(),INPUT_PULLUP); + value = !generalDevice.dRead1(); + }else{ + pinMode(generalDevice.pin2(),INPUT_PULLUP); + value = !generalDevice.dRead2(); + } + sendFloat(value); + } + break; +// case COMPASS:{ +// if(Compass.getPort()!=port){ +// Compass.reset(port); +// Compass.setpin(Compass.pin1(),Compass.pin2()); +// } +// double CompassAngle; +// CompassAngle = Compass.getAngle(); +// sendDouble(CompassAngle); +// } +// break; + case HUMITURE:{ + uint8_t index = readBuffer(7); + if(humiture.getPort()!=port){ + humiture.reset(port); + } + uint8_t HumitureData; + humiture.update(); + HumitureData = humiture.getValue(index); + sendByte(HumitureData); + } + break; + case FLAMESENSOR:{ + if(FlameSensor.getPort()!=port){ + FlameSensor.reset(port); + FlameSensor.setpin(FlameSensor.pin2(),FlameSensor.pin1()); + } + int16_t FlameData; + FlameData = FlameSensor.readAnalog(); + sendShort(FlameData); + } + break; + case GASSENSOR:{ + if(GasSensor.getPort()!=port){ + GasSensor.reset(port); + GasSensor.setpin(GasSensor.pin2(),GasSensor.pin1()); + } + int16_t GasData; + GasData = GasSensor.readAnalog(); + sendShort(GasData); + } + break; + case GYRO:{ + int axis = readBuffer(7); + gyro.update(); + if(axis == 1){ + value = gyro.getAngleX(); + sendFloat(value); + }else if(axis == 2){ + value = gyro.getAngleY(); + sendFloat(value); + }else if(axis == 3){ + value = gyro.getAngleZ(); + sendFloat(value); + } + } + break; + case VERSION:{ + sendString(mVersion); + } + break; + case DIGITAL:{ + pinMode(pin,INPUT); + sendFloat(digitalRead(pin)); + } + break; + case ANALOG:{ + pin = analogs[pin]; + pinMode(pin,INPUT); + sendFloat(analogRead(pin)); + } + break; + case PULSEIN:{ + int pw = readShort(7); + pinMode(pin, INPUT); + sendShort(pulseIn(pin,HIGH,pw)); + } + break; + case ULTRASONIC_ARDUINO:{ + int trig = readBuffer(6); + int echo = readBuffer(7); + pinMode(trig,OUTPUT); + digitalWrite(trig,LOW); + delayMicroseconds(2); + digitalWrite(trig,HIGH); + delayMicroseconds(10); + digitalWrite(trig,LOW); + pinMode(echo, INPUT); + sendFloat(pulseIn(echo,HIGH,30000)/58.0); + } + break; + case TIMER:{ + sendFloat((float)currentTime); + } + break; + case TOUCH_SENSOR: + { + if(touchSensor.getPort() != port){ + touchSensor.reset(port); + } + sendByte(touchSensor.touched()); + } + break; + case BUTTON: + { + if(buttonSensor.getPort() != port){ + buttonSensor.reset(port); + } + sendByte(keyPressed == readBuffer(7)); + } + break; + } +} diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/eeprom.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/eeprom.ino new file mode 100644 index 0000000..cd94e42 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/eeprom.ino @@ -0,0 +1,104 @@ +float RELAX_ANGLE = 0; //� +void WriteBalancedDataToEEPROM(void) +{ + EEPROM.write(BALANCED_CAR_PARTITION_CHECK, EEPROM_IF_HAVEPID_CHECK1); + EEPROM.write(BALANCED_CAR_PARTITION_CHECK + 1, EEPROM_IF_HAVEPID_CHECK2); + EEPROM.write(BALANCED_CAR_START_ADDR, EEPROM_CHECK_START); + + EEPROM.put(BALANCED_CAR_NATURAL_BALANCE, RELAX_ANGLE); + EEPROM.put(BALANCED_CAR_ANGLE_PID_ADDR, PID_angle.P); + EEPROM.put(BALANCED_CAR_ANGLE_PID_ADDR+4, PID_angle.I); + EEPROM.put(BALANCED_CAR_ANGLE_PID_ADDR+8, PID_angle.D); + + EEPROM.put(BALANCED_CAR_SPEED_PID_ADDR, PID_speed.P); + EEPROM.put(BALANCED_CAR_SPEED_PID_ADDR+4, PID_speed.I); + EEPROM.put(BALANCED_CAR_SPEED_PID_ADDR+8, PID_speed.D); + + EEPROM.put(BALANCED_CAR_DIR_PID_ADDR, PID_turn.P); + EEPROM.write(BALANCED_CAR_END_ADDR, EEPROM_CHECK_END); + + EEPROM.write(AURIGA_MODE_START_ADDR, EEPROM_CHECK_START); + EEPROM.write(BALANCED_CAR_SPEED_PID_ADDR, megapi_mode); + EEPROM.write(AURIGA_MODE_END_ADDR, EEPROM_CHECK_END); +} + +void WriteAurigaModeToEEPROM(void) +{ + EEPROM.write(MEGAPI_MODE_PARTITION_CHECK, EEPROM_IF_HAVEPID_CHECK1); + EEPROM.write(MEGAPI_MODE_PARTITION_CHECK + 1, EEPROM_IF_HAVEPID_CHECK2); + EEPROM.write(MEGAPI_MODE_START_ADDR, EEPROM_CHECK_START); + EEPROM.write(MEGAPI_MODE_CONFIGURE, megapi_mode); + EEPROM.write(MEGAPI_MODE_END_ADDR, EEPROM_CHECK_END); +} + +int readEEPROM(void) +{ + if((EEPROM.read(BALANCED_CAR_PARTITION_CHECK) == EEPROM_IF_HAVEPID_CHECK1) && (EEPROM.read(BALANCED_CAR_PARTITION_CHECK + 1) == EEPROM_IF_HAVEPID_CHECK2)) + { + if((EEPROM.read(BALANCED_CAR_START_ADDR) == EEPROM_CHECK_START) && (EEPROM.read(BALANCED_CAR_END_ADDR) == EEPROM_CHECK_END)) + { + EEPROM.get(BALANCED_CAR_NATURAL_BALANCE, RELAX_ANGLE); + EEPROM.get(BALANCED_CAR_ANGLE_PID_ADDR, PID_angle.P); + EEPROM.get(BALANCED_CAR_ANGLE_PID_ADDR+4, PID_angle.I); + EEPROM.get(BALANCED_CAR_ANGLE_PID_ADDR+8, PID_angle.D); + + EEPROM.get(BALANCED_CAR_SPEED_PID_ADDR, PID_speed.P); + EEPROM.get(BALANCED_CAR_SPEED_PID_ADDR+4, PID_speed.I); + EEPROM.get(BALANCED_CAR_SPEED_PID_ADDR+8, PID_speed.D); + + EEPROM.get(BALANCED_CAR_DIR_PID_ADDR, PID_turn.P); +#ifdef DEBUG_INFO + Serial.println( "Read data from EEPROM:"); + Serial.print(RELAX_ANGLE); + Serial.print( " "); + Serial.print(PID_angle.P); + Serial.print( " "); + Serial.print(PID_angle.I); + Serial.print( " "); + Serial.print(PID_angle.D); + Serial.print( " "); + Serial.print(PID_speed.P); + Serial.print( " "); + Serial.print(PID_speed.I); + Serial.print( " "); + Serial.print(PID_speed.D); + Serial.print( " "); + Serial.println(PID_turn.P); +#endif + } + else + { + Serial.println( "Data area damage on balanced car pid!" ); + } + } + else + { +#ifdef DEBUG_INFO + Serial.println( "First written Balanced data!" ); +#endif + WriteBalancedDataToEEPROM(); + } + + if((EEPROM.read(AURIGA_MODE_PARTITION_CHECK) == EEPROM_IF_HAVEPID_CHECK1) && (EEPROM.read(AURIGA_MODE_PARTITION_CHECK + 1) == EEPROM_IF_HAVEPID_CHECK2)) + { + if((EEPROM.read(AURIGA_MODE_START_ADDR) == EEPROM_CHECK_START) && (EEPROM.read(AURIGA_MODE_END_ADDR) == EEPROM_CHECK_END)) + { + EEPROM.get(AURIGA_MODE_CONFIGURE, megapi_mode); +#ifdef DEBUG_INFO + Serial.print( "Read auriga_mode from EEPROM:"); + Serial.println(auriga_mode); +#endif + } + else + { + Serial.println( "Data area damage on auriga mode!" ); + } + } + else + { +#ifdef DEBUG_INFO + Serial.println( "First written auriga mode!" ); +#endif + WriteAurigaModeToEEPROM(); + } +} diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/encoders.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/encoders.ino new file mode 100644 index 0000000..b1e15ce --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/encoders.ino @@ -0,0 +1,168 @@ +void encodersInit() +{ + encoders[0].reset(SLOT1); + encoders[1].reset(SLOT2); + encoders[2].reset(SLOT3); + encoders[3].reset(SLOT4); + attachInterrupt(encoders[0].getIntNum(), isr_process_encoder1, RISING); + attachInterrupt(encoders[1].getIntNum(), isr_process_encoder2, RISING); + attachInterrupt(encoders[2].getIntNum(), isr_process_encoder3, RISING); + attachInterrupt(encoders[3].getIntNum(), isr_process_encoder4, RISING); + + measurement_speed_time = lasttime_speed = lasttime_angle = millis(); + encoders[0].setPulsePos(0); + encoders[1].setPulsePos(0); + encoders[2].setPulsePos(0); + encoders[3].setPulsePos(0); + PID_speed_left.Setpoint = 0; + PID_speed_right.Setpoint = 0; +} +void encodersUpdate() +{ + for(int i=0;i<4;i++) + { + encoders[i].loop(); + } +} +void onEncoderMovingFinish(int slot,int extId) +{ + writeHead(); + writeSerial(extId); + sendByte(slot); + writeEnd(); +} +void PWM_Calcu() +{ + double speed1; + double speed2; + if((millis() - lasttime_speed) > 20) + { + speed1 = encoders[0].getCurrentSpeed(); + speed2 = encoders[1].getCurrentSpeed(); + +#ifdef DEBUG_INFO + Serial.print("S1: "); + Serial.print(speed1); + Serial.print(" S2: "); + Serial.print(speed2); + Serial.print("left: "); + Serial.print(PID_speed_left.Setpoint); + Serial.print(" right: "); + Serial.println(PID_speed_right.Setpoint); +#endif + + if(abs(abs(PID_speed_left.Setpoint) - abs(PID_speed_right.Setpoint)) >= 0) + { + encoders[0].setMotorPwm(PID_speed_left.Setpoint); + encoders[1].setMotorPwm(PID_speed_right.Setpoint); + return; + } + + if((abs(PID_speed_left.Setpoint) == 0) && (abs(PID_speed_right.Setpoint) == 0)) + { + return; + } + + if(abs(speed1) - abs(speed2) >= 0) + { + if(PID_speed_left.Setpoint > 0) + { + encoders[0].setMotorPwm(PID_speed_left.Setpoint - (abs(speed1) - abs(speed2))); + encoders[1].setMotorPwm(PID_speed_right.Setpoint); + } + else + { + encoders[0].setMotorPwm(PID_speed_left.Setpoint + (abs(speed1) - abs(speed2))); + encoders[1].setMotorPwm(PID_speed_right.Setpoint); + } + } + else + { + if(PID_speed_right.Setpoint > 0) + { + encoders[0].setMotorPwm(PID_speed_left.Setpoint); + encoders[1].setMotorPwm(PID_speed_right.Setpoint - (abs(speed2) - abs(speed1))); + } + else + { + encoders[0].setMotorPwm(PID_speed_left.Setpoint); + encoders[1].setMotorPwm(PID_speed_right.Setpoint + (abs(speed2) - abs(speed1))); + } + } + lasttime_speed = millis(); + } +} + +void Forward(void) +{ +// Encoder_1.setMotorPwm(-moveSpeed); +// Encoder_2.setMotorPwm(moveSpeed); + PID_speed_left.Setpoint = -moveSpeed; + PID_speed_right.Setpoint = moveSpeed; + move_status = MOVE_FORWARD; + PWM_Calcu(); +} + +void Backward(void) +{ +// Encoder_1.setMotorPwm(moveSpeed); +// Encoder_2.setMotorPwm(-moveSpeed); + PID_speed_left.Setpoint = moveSpeed; + PID_speed_right.Setpoint = -moveSpeed; + move_status = MOVE_BACKWARD; + PWM_Calcu(); +} + +void Stop(void) +{ + encoders[0].setMotorPwm(0); + encoders[1].setMotorPwm(0); + move_status = MOVE_STOP; +} +void isr_process_encoder1(void) +{ + if(digitalRead(encoders[0].getPortB()) == 0) + { + encoders[0].pulsePosMinus(); + } + else + { + encoders[0].pulsePosPlus(); + } +} + +void isr_process_encoder2(void) +{ + if(digitalRead(encoders[1].getPortB()) == 0) + { + encoders[1].pulsePosMinus(); + } + else + { + encoders[1].pulsePosPlus(); + } +} + +void isr_process_encoder3(void) +{ + if(digitalRead(encoders[2].getPortB()) == 0) + { + encoders[2].pulsePosMinus(); + } + else + { + encoders[2].pulsePosPlus(); + } +} + +void isr_process_encoder4(void) +{ + if(digitalRead(encoders[3].getPortB()) == 0) + { + encoders[3].pulsePosMinus(); + } + else + { + encoders[3].pulsePosPlus(); + } +} diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/excute.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/excute.ino new file mode 100644 index 0000000..2073f5b --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/excute.ino @@ -0,0 +1,697 @@ +void runModule(int device) +{ + //0xff 0x55 0x6 0x0 0x1 0xa 0x9 0x0 0x0 0xa + int port = readBuffer(6); + int pin = port; + int speed; + long position; + long distance; + int type; + int slot; + int extId; + switch(device) + { + case MOTOR: + { + speed = readShort(7); + dc.reset(port); + dc.run(speed); + } + break; + case ENCODER_BOARD: + slot = readBuffer(7); + type = readBuffer(8); + switch(type){ + case ENCODER_BOARD_RUN: + { + if(port == 0) + { + int speed_value = readShort(9); + Serial.println(speed_value); + encoders[slot-1].runSpeed(speed_value); + } + } + break; + case ENCODER_BOARD_MOVE: + { + if(port == 0) + { + int speed_value = readShort(9); + distance = readLong(11); + extId = readBuffer(3); + encoders[slot-1].move(distance,speed_value,onEncoderMovingFinish,extId); + } + } + break; + case ENCODER_BOARD_MOVE_TO: + { + if(port == 0) + { + int speed_value = readShort(9); + position = readLong(11); + extId = readBuffer(3); + encoders[slot-1].moveTo(position,speed_value,onEncoderMovingFinish,extId); + } + } + break; + } + + break; + case JOYSTICK: + { + int leftSpeed = readShort(6); + dc.reset(M1); + dc.run(leftSpeed); + int rightSpeed = readShort(8); + dc.reset(M2); + dc.run(rightSpeed); + } + break; + case STEPPER_BOARD: + { + type = readBuffer(7); + switch(type){ + case STEPPER_BOARD_RUN: + speed = readShort(8); + steppers[port-1].setSpeed(speed); + break; + case STEPPER_BOARD_MOVE: + speed = readShort(8); + distance = readLong(10); + extId = readBuffer(3); + steppers[port-1].setSpeed(speed); + steppers[port-1].move(distance,onStepperMovingFinish,extId); + break; + case STEPPER_BOARD_MOVE_TO: + speed = readShort(8); + position = readLong(10); + extId = readBuffer(3); + steppers[port-1].setSpeed(speed); + steppers[port-1].moveTo(position,onStepperMovingFinish,extId); + break; + case STEPPER_BOARD_SETTING: + int microsteps = readBuffer(8); + int acceleration = readShort(9); + steppers[port-1].setMicroStep(microsteps); + steppers[port-1].setAcceleration(acceleration); + break; + } + } + break; + case RGBLED: + { + slot = readBuffer(7); + int idx = readBuffer(8); + int r = readBuffer(9); + int g = readBuffer(10); + int b = readBuffer(11); + if(port != 0) + { + led.reset(port,slot); + } + if(idx>0) + { + led.setColorAt(idx-1,r,g,b); + } + else + { + led.setColor(r,g,b); + } + led.show(); + } + break; + + case RGBLED_DISPLAY: + { + slot = readBuffer(7); + int idx = readBuffer(8); + int r = readBuffer(9); + int g = readBuffer(10); + int b = readBuffer(11); + if(port != 0) + { + led.reset(port,slot); + } + if(idx>0) + { + led.setColorAt(idx-1,r,g,b); + } + else + { + led.setColor(r,g,b); + } + } + break; + case RGBLED_SHOW: + { + slot = readBuffer(7); + if(port != 0) + { + led.reset(port,slot); + } + led.show(); + } + break; + case COMMON_COMMONCMD: + { + int8_t subcmd = port; + int8_t cmd_data = readBuffer(7); + if(SET_MEGAPI_MODE == subcmd) + { + Stop(); + if((cmd_data == BALANCED_MODE) || + (cmd_data == AUTOMATIC_OBSTACLE_AVOIDANCE_MODE) || + (cmd_data == BLUETOOTH_MODE) || + (cmd_data == IR_REMOTE_MODE)) + { + megapi_mode = cmd_data; + EEPROM.write(MEGAPI_MODE_CONFIGURE, megapi_mode); + } + else + { + megapi_mode = BLUETOOTH_MODE; + EEPROM.write(MEGAPI_MODE_CONFIGURE, megapi_mode); + } + } + } + break; + case SERVO: + { + slot = readBuffer(7); + pin = slot==1?mePort[port].s1:mePort[port].s2; + int v = readBuffer(8); + Servo sv = servos[searchServoPin(pin)]; + if(v >= 0 && v <= 180) + { + if(port > 0) + { + sv.attach(pin); + } + else + { + sv.attach(pin); + } + sv.write(v); + } + } + break; + case SEVSEG: + { + if(seg.getPort() != port) + { + seg.reset(port); + } + float v = readFloat(7); + seg.display(v); + } + break; + case LEDMATRIX: + { + if(ledMx.getPort()!=port) + { + ledMx.reset(port); + ledMx.setBrightness(6); + ledMx.setColorIndex(1); + } + int action = readBuffer(7); + if(action==1) + { + char px = readBuffer(8); + char py = readBuffer(9); + int len = readBuffer(10); + char *s = readString(11,len); + ledMx.drawStr(px,py,s); + } + else if(action==2) + { + char px = readBuffer(8); + char py = readBuffer(9); + uint8_t *ss = readUint8(10,16); + ledMx.drawBitmap(px,py,16,ss); + } + else if(action==3) + { + int point = readBuffer(8); + int hours = readBuffer(9); + int minutes = readBuffer(10); + ledMx.showClock(hours,minutes,point); + }else if(action == 4) + { + ledMx.showNum(readFloat(8),3); + } + } + break; + case LIGHT_SENSOR: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + } + int v = readBuffer(7); + generalDevice.dWrite1(v); + } + break; + case SHUTTER: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + } + int v = readBuffer(7); + if(v < 2) + { + generalDevice.dWrite1(v); + } + else + { + generalDevice.dWrite2(v-2); + } + } + break; + case DIGITAL: + { + pinMode(pin,OUTPUT); + int v = readBuffer(7); + digitalWrite(pin,v); + } + break; + case PWM: + { + pinMode(pin,OUTPUT); + int v = readBuffer(7); + analogWrite(pin,v); + } + break; + case TONE: + { + pinMode(pin,OUTPUT); + int hz = readShort(7); + int ms = readShort(9); + if(ms > 0) + { + buzzer.tone(pin, hz, ms); + } + else + { + buzzer.noTone(pin); + } + } + break; + case SERVO_PIN: + { + int v = readBuffer(7); + if(v >= 0 && v <= 180) + { + Servo sv = servos[searchServoPin(pin)]; + sv.attach(pin); + sv.write(v); + } + } + break; + case PRESSURE_SENSOR: + { + pressureSensor.begin(); + } + break; + case TIMER: + { + lastTime = millis()/1000.0; + } + break; + case JOYSTICK_MOVE: + { + if(port == 0) + { + //if needed balance mode, add here + } + } + break; + } +} + +int searchServoPin(int pin) +{ + for(int i=0;i<8;i++) + { + if(servo_pins[i] == pin) + { + return i; + } + if(servo_pins[i] == 0) + { + servo_pins[i] = pin; + return i; + } + } + return 0; +} +void readSensor(int device) +{ + /************************************************** + ff 55 len idx action device port slot data a + 0 1 2 3 4 5 6 7 8 + ***************************************************/ + float value=0.0; + int8_t port,slot,pin; + port = readBuffer(6); + pin = port; + switch(device) + { + case ULTRASONIC_SENSOR: + { + if(us == NULL) + { + us = new MeUltrasonicSensor(port); + } + else if(us->getPort() != port) + { + delete us; + us = new MeUltrasonicSensor(port); + } + value = us->distanceCm(); + sendFloat(value); + } + break; + case TEMPERATURE_SENSOR: + { + slot = readBuffer(7); + if(ts.getPort() != port || ts.getSlot() != slot) + { + ts.reset(port,slot); + } + value = ts.temperature(); + sendFloat(value); + } + break; + case LIGHT_SENSOR: + case SOUND_SENSOR: + case TEMPERATURE_SENSOR_1: + case POTENTIONMETER: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.aRead2(); + sendFloat(value); + } + break; + case JOYSTICK: + { + slot = readBuffer(7); + if(joystick.getPort() != port) + { + joystick.reset(port); + } + value = joystick.read(slot); + sendFloat(value); + } + break; + case INFRARED: + { + if(ir == NULL) + { + ir = new MeInfraredReceiver(port); + ir->begin(); + } + else if(ir->getPort() != port) + { + delete ir; + ir = new MeInfraredReceiver(port); + ir->begin(); + } + irRead = ir->getCode(); + if((irRead < 255) && (irRead > 0)) + { + sendFloat((float)irRead); + } + else + { + sendFloat(0); + } + } + break; + case PIRMOTION: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead2(); + sendFloat(value); + } + break; + case LINEFOLLOWER: + { + if(generalDevice.getPort() != port) + { + generalDevice.reset(port); + pinMode(generalDevice.pin1(),INPUT); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead1()*2+generalDevice.dRead2(); + sendFloat(value); + } + break; + case LIMITSWITCH: + { + slot = readBuffer(7); + if(generalDevice.getPort() != port || generalDevice.getSlot() != slot) + { + generalDevice.reset(port,slot); + } + if(slot == 1) + { + pinMode(generalDevice.pin1(),INPUT_PULLUP); + value = generalDevice.dRead1(); + } + else + { + pinMode(generalDevice.pin2(),INPUT_PULLUP); + value = generalDevice.dRead2(); + } + sendFloat(value); + } + break; + case COMPASS: + { + if(Compass.getPort() != port) + { + Compass.reset(port); + Compass.setpin(Compass.pin1(),Compass.pin2()); + } + double CompassAngle; + CompassAngle = Compass.getAngle(); + sendDouble(CompassAngle); + } + break; + case HUMITURE: + { + uint8_t index = readBuffer(7); + if(humiture.getPort() != port) + { + humiture.reset(port); + } + uint8_t HumitureData; + humiture.update(); + HumitureData = humiture.getValue(index); + sendByte(HumitureData); + } + break; + case FLAMESENSOR: + { + if(FlameSensor.getPort() != port) + { + FlameSensor.reset(port); + FlameSensor.setpin(FlameSensor.pin2(),FlameSensor.pin1()); + } + int16_t FlameData; + FlameData = FlameSensor.readAnalog(); + sendShort(FlameData); + } + break; + case GASSENSOR: + { + if(GasSensor.getPort() != port) + { + GasSensor.reset(port); + GasSensor.setpin(GasSensor.pin2(),GasSensor.pin1()); + } + int16_t GasData; + GasData = GasSensor.readAnalog(); + sendShort(GasData); + } + break; + case ANGULAR_SENSOR: + { + slot = readBuffer(7); + pin = slot==1?mePort[port].s1:mePort[port].s2; + sendShort(analogRead(pin)); + } + break; + case GYRO: + { + int axis = readBuffer(7); + if(port == 0) + { + gyro.update(); + value = gyro.getAngle(axis); + sendFloat(value); + } + } + break; + case VERSION: + { + sendString(mVersion); + } + break; + case DIGITAL: + { + pinMode(pin,INPUT); + sendFloat(digitalRead(pin)); + } + break; + case ANALOG: + { + pin = analogs[pin]; + pinMode(pin,INPUT); + sendFloat(analogRead(pin)); + } + break; + case PULSEIN: + { + int pw = readShort(7); + pinMode(pin, INPUT); + sendShort(pulseIn(pin,HIGH,pw)); + } + break; + case ULTRASONIC_ARDUINO: + { + int trig = readBuffer(6); + int echo = readBuffer(7); + pinMode(trig,OUTPUT); + digitalWrite(trig,LOW); + delayMicroseconds(2); + digitalWrite(trig,HIGH); + delayMicroseconds(10); + digitalWrite(trig,LOW); + pinMode(echo, INPUT); + sendFloat(pulseIn(echo,HIGH,30000)/58.0); + } + break; + case PRESSURE_SENSOR: + { + int action = readBuffer(6); + switch(action){ + case 1: + { + sendLong(pressureSensor.readPressure()); + } + break; + case 2: + { + sendLong(pressureSensor.readTemperature()); + } + break; + case 3: + { + sendFloat(pressureSensor.readAltitude()); + } + break; + case 4: + { + sendFloat(pressureSensor.readAltitude(101500)); + } + break; + case 5: + { + sendLong(pressureSensor.readSealevelPressure()); + } + break; + } + } + break; + case TIMER: + { + sendFloat((float)currentTime); + } + break; + case ENCODER_BOARD: + { + if(port == 0) + { + slot = readBuffer(7); + uint8_t read_type = readBuffer(8); + switch(read_type) + { + case ENCODER_BOARD_POS: + { + sendLong(encoders[slot-1].getPulsePos()); + } + break; + case ENCODER_BOARD_SPEED: + { + sendFloat(encoders[slot-1].getCurrentSpeed()); + } + break; + } + } + } + break; + case STEPPER_BOARD: + { + if(port == 0) + { + slot = readBuffer(7); + uint8_t read_type = readBuffer(8); + switch(read_type) + { + case STEPPER_BOARD_POS: + { + sendLong(steppers[slot-1].currentPosition()); + } + break; + case STEPPER_BOARD_SPEED: + { + sendFloat(steppers[slot-1].speed()); + } + break; + } + } + } + break; + case COMMON_COMMONCMD: + { + int8_t subcmd = port; + if(GET_BATTERY_POWER == subcmd) + { + //do nothing + } + } + break; + }//switch +} +void resetAll() +{ + encoders[0].setMotorPwm(0); + encoders[1].setMotorPwm(0); + encoders[2].setMotorPwm(0); + encoders[3].setMotorPwm(0); + encoders[0].setPulsePos(0); + encoders[1].setPulsePos(0); + encoders[2].setPulsePos(0); + encoders[3].setPulsePos(0); + PID_speed_left.Setpoint = 0; + PID_speed_right.Setpoint = 0; + dc.reset(M1); + dc.run(0); + dc.reset(M2); + dc.run(0); + dc.reset(PORT_1); + dc.run(0); + dc.reset(PORT_2); + dc.run(0); + callOK(); +} diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/init.h b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/init.h new file mode 100644 index 0000000..865ec99 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/init.h @@ -0,0 +1,197 @@ +Servo servos[8]; +MeMegaPiDCMotor dc; +MeTemperature ts; +MeRGBLed led; +MeUltrasonicSensor *us = NULL; +Me7SegmentDisplay seg; +MePort generalDevice; +MeLEDMatrix ledMx; +MeInfraredReceiver *ir = NULL; +MeGyro gyro; +MeCompass Compass; +MeJoystick joystick; +MeBuzzer buzzer; +MeHumiture humiture; +MeFlameSensor FlameSensor; +MeGasSensor GasSensor; +MePressureSensor pressureSensor; +MeSerial mySerial(PORT_9); +MeStepperOnBoard steppers[4]; +MeEncoderOnBoard encoders[4]; +long encodersPosition[4] = {0,0,0,0}; +long steppersPosition[4] = {0,0,0,0}; +boolean encodersMoving[4] = {false,false,false,false}; +boolean steppersMoving[4] = {false,false,false,false}; + +int16_t servo_pins[8]={0,0,0,0,0,0,0,0}; +int16_t moveSpeed = 255; + +#define MOVE_STOP 0x00 +#define MOVE_FORWARD 0x01 +#define MOVE_BACKWARD 0x02 + +int16_t move_status = MOVE_STOP; + +#define BLUETOOTH_MODE 0x00 +#define AUTOMATIC_OBSTACLE_AVOIDANCE_MODE 0x01 +#define BALANCED_MODE 0x02 +#define IR_REMOTE_MODE 0x03 + +//#define POWER_PORT A4 +//#define BUZZER_PORT 45 +//#define RGBLED_PORT 44 + +#define DATA_SERIAL 0 +#define DATA_SERIAL1 1 +#define DATA_SERIAL2 2 +#define DATA_SERIAL3 3 + +uint8_t megapi_mode = BLUETOOTH_MODE; +uint8_t index = 0; +uint8_t dataLen; +uint8_t modulesLen=0; +uint8_t irRead = 0; +uint8_t prevc=0; +uint8_t BluetoothSource = DATA_SERIAL; +char serialRead; +char buffer[52]; +char bufferBt1[52]; +char bufferBt2[52]; + +char buf[64]; +char bufindex; + +double lastTime = 0.0; +double currentTime = 0.0; +float angleServo = 90.0; + +boolean isStart = false; +boolean isAvailable = false; + +#define VERSION 0 +#define ULTRASONIC_SENSOR 1 +#define TEMPERATURE_SENSOR 2 +#define LIGHT_SENSOR 3 +#define POTENTIONMETER 4 +#define JOYSTICK 5 +#define GYRO 6 +#define SOUND_SENSOR 7 +#define RGBLED 8 +#define SEVSEG 9 +#define MOTOR 10 +#define SERVO 11 +#define ENCODER 12 +#define IR 13 +#define PIRMOTION 15 +#define INFRARED 16 +#define LINEFOLLOWER 17 +#define RGBLED_DISPLAY 18 +#define RGBLED_SHOW 19 +#define SHUTTER 20 +#define LIMITSWITCH 21 +#define BUTTON 22 +#define HUMITURE 23 +#define FLAMESENSOR 24 +#define GASSENSOR 25 +#define COMPASS 26 +#define TEMPERATURE_SENSOR_1 27 +#define ANGULAR_SENSOR 28 +#define PRESSURE_SENSOR 29 +#define DIGITAL 30 +#define ANALOG 31 +#define PWM 32 +#define SERVO_PIN 33 +#define TONE 34 +#define PULSEIN 35 +#define ULTRASONIC_ARDUINO 36 +#define STEPPER 40 +#define LEDMATRIX 41 +#define TIMER 50 +#define JOYSTICK_MOVE 52 +#define COMMON_COMMONCMD 60 + //Secondary command + #define SET_STARTER_MODE 0x10 + #define SET_AURIGA_MODE 0x11 + #define SET_MEGAPI_MODE 0x12 + #define GET_BATTERY_POWER 0x70 + +#define ENCODER_BOARD 61 + //Motion type + #define ENCODER_BOARD_RUN 0x01 + #define ENCODER_BOARD_MOVE 0x02 + #define ENCODER_BOARD_MOVE_TO 0x03 + #define ENCODER_BOARD_SETTING 0x04 + //Read type + #define ENCODER_BOARD_POS 0x01 + #define ENCODER_BOARD_SPEED 0x02 + +#define STEPPER_BOARD 62 + //Motion type + #define STEPPER_BOARD_RUN 0x01 + #define STEPPER_BOARD_MOVE 0x02 + #define STEPPER_BOARD_MOVE_TO 0x03 + #define STEPPER_BOARD_SETTING 0x04 + //Read type + #define STEPPER_BOARD_POS 0x01 + #define STEPPER_BOARD_SPEED 0x02 + +#define GET 1 +#define RUN 2 +#define RESET 4 +#define START 5 + + +typedef struct MeModule +{ + int16_t device; + int16_t port; + int16_t slot; + int16_t pin; + int16_t index; + float values[3]; +} MeModule; + +union +{ + byte byteVal[4]; + float floatVal; + long longVal; +}val; + +union +{ + byte byteVal[8]; + double doubleVal; +}valDouble; + +union +{ + byte byteVal[2]; + short shortVal; +}valShort; +MeModule modules[12]; +#if defined(__AVR_ATmega32U4__) + int analogs[12]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11}; +#endif +#if defined(__AVR_ATmega328P__) or defined(__AVR_ATmega168__) + int analogs[8]={A0,A1,A2,A3,A4,A5,A6,A7}; +#endif +#if defined(__AVR_ATmega1280__)|| defined(__AVR_ATmega2560__) + int analogs[16]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15}; +#endif +long measurement_speed_time = 0; +long lasttime_angle = 0; +long lasttime_speed = 0; +long last_Pulse_pos_encoder1 = 0; +long last_Pulse_pos_encoder2 = 0; +long last_Pulse_pos_encoder3 = 0; +long last_Pulse_pos_encoder4 = 0; +////////////////////////////////////////////////////////////////////////////////////// +typedef struct +{ + double P, I, D; + double Setpoint, Output, Integral,differential, last_error; +} PID; + +PID PID_angle, PID_speed, PID_turn; +PID PID_speed_left, PID_speed_right; diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/megapi_firmware.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/megapi_firmware.ino new file mode 100644 index 0000000..618231d --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/megapi_firmware.ino @@ -0,0 +1,40 @@ +/************************************************************************* +* File Name : Firmware_for_MegaPi.ino +* Author : myan +* Updated : myan +* Version : V0e.01.101 +* Date : 02/20/2016 +* Description : Firmware for Makeblock Electronic modules with Scratch. +* License : CC-BY-SA 3.0 +* Copyright (C) 2013 - 2016 Maker Works Technology Co., Ltd. All right reserved. +* http://www.makeblock.cc/ +**************************************************************************/ +#include +#include +#include "MeEEPROM.h" +#include +#include +#include "init.h" +//#define DEBUG_INFO +String mVersion = "0e.01.101"; +void setup() +{ + delay(5); + Serial.begin(115200); + Serial2.begin(115200); + Serial3.begin(115200); + delay(100); + Serial.print("Version: "); + Serial.println(mVersion); + encodersInit(); + steppersInit(); + delay(100); +} +void loop() +{ + parserRead(); + encodersUpdate(); + steppersUpdate(); +} + + diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/parser.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/parser.ino new file mode 100644 index 0000000..2398813 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/parser.ino @@ -0,0 +1,276 @@ +void parserRead() +{ + + currentTime = millis()/1000.0-lastTime; + readSerial(); + if(isAvailable) + { + unsigned char c = serialRead & 0xff; + if((c == 0x55) && (isStart == false)) + { + if(prevc == 0xff) + { + index=1; + isStart = true; + } + } + else + { + prevc = c; + if(isStart) + { + if(index == 2) + { + dataLen = c; + } + else if(index > 2) + { + dataLen--; + } + writeBuffer(index,c); + } + } + index++; + if(index > 51) + { + index=0; + isStart=false; + } + if(isStart && (dataLen == 0) && (index > 3)) + { + isStart = false; + parseData(); + index=0; + } + } +} +unsigned char readBuffer(int index) +{ + if(BluetoothSource == DATA_SERIAL) + { + return buffer[index]; + } + else if(BluetoothSource == DATA_SERIAL2) + { + return bufferBt1[index]; + } + else if(BluetoothSource == DATA_SERIAL3) + { + return bufferBt2[index]; + } +} + +void writeBuffer(int index,unsigned char c) +{ + if(BluetoothSource == DATA_SERIAL) + { + buffer[index]=c; + } + else if(BluetoothSource == DATA_SERIAL2) + { + bufferBt1[index]=c; + } + else if(BluetoothSource == DATA_SERIAL3) + { + bufferBt2[index]=c; + } +} +void writeSerial(unsigned char c) +{ + Serial.write(c); + Serial2.write(c); + Serial3.write(c); +} + +void readSerial(void) +{ + isAvailable = false; + BluetoothSource = DATA_SERIAL; + if(Serial.available() > 0) + { + isAvailable = true; + BluetoothSource = DATA_SERIAL; + serialRead = Serial.read(); + } + + if(Serial2.available() > 0) + { + isAvailable = true; + BluetoothSource = DATA_SERIAL2; + serialRead = Serial2.read(); + } + + if(Serial3.available() > 0) + { + isAvailable = true; + BluetoothSource = DATA_SERIAL3; + serialRead = Serial3.read(); + } +} +void writeHead(void) +{ + writeSerial(0xff); + writeSerial(0x55); +} + +void writeEnd(void) +{ + Serial.println(); + Serial2.println(); + Serial3.println(); +} + + +/* +ff 55 len idx action device port slot data a +0 1 2 3 4 5 6 7 8 +*/ +void parseData(void) +{ + isStart = false; + int idx = readBuffer(3); + int action = readBuffer(4); + int device = readBuffer(5); + switch(action) + { + case GET: + { + writeHead(); + writeSerial(idx); + readSensor(device); + writeEnd(); + } + break; + case RUN: + { + runModule(device); + //callOK(); + } + break; + case RESET: + { + //reset + resetAll(); + } + break; + case START: + { + //start + callOK(); + } + break; + } +} + +void callOK(void) +{ + writeSerial(0xff); + writeSerial(0x55); + writeEnd(); +} + +void sendByte(char c) +{ + writeSerial(1); + writeSerial(c); +} + +void sendString(String s) +{ + int l = s.length(); + writeSerial(4); + writeSerial(l); + for(int i=0;i 15) + { + break; + } + _receiveUint8[i] = readBuffer(idx+i); + } + return _receiveUint8; +} diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/steppers.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/steppers.ino new file mode 100644 index 0000000..500139f --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/megapi_firmware/steppers.ino @@ -0,0 +1,28 @@ +//blue red green black +//A+ A- B+ B- +void steppersInit() +{ + steppers[0] = MeStepperOnBoard(SLOT1); + steppers[1] = MeStepperOnBoard(SLOT2); + steppers[2] = MeStepperOnBoard(SLOT3); + steppers[3] = MeStepperOnBoard(SLOT4); + for(int i=0;i<4;i++){ + steppers[i].setMaxSpeed(10000); + steppers[i].setAcceleration(10000); + steppers[i].setMicroStep(16); + } +} +void steppersUpdate() +{ + for(int i=0;i<4;i++){ + steppers[i].update(); + } +} +void onStepperMovingFinish(int slot,int extId) +{ + writeHead(); + writeSerial(extId); + sendByte(slot); + writeEnd(); +} + diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/orion_firmware/orion_firmware.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/orion_firmware/orion_firmware.ino new file mode 100644 index 0000000..858ff31 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/orion_firmware/orion_firmware.ino @@ -0,0 +1,734 @@ +/************************************************************************* +* File Name : orion_firmware.ino +* Author : Ander, Mark Yan +* Updated : Ander, Mark Yan +* Version : V0a.01.106 +* Date : 01/03/2017 +* Description : Firmware for Makeblock Electronic modules with Scratch. +* License : CC-BY-SA 3.0 +* Copyright (C) 2013 - 2016 Maker Works Technology Co., Ltd. All right reserved. +* http://www.makeblock.cc/ +**************************************************************************/ +#include +#include +#include +#include + +Servo servos[8]; +MeDCMotor dc; +MeTemperature ts; +MeRGBLed led; +MeUltrasonicSensor us; +Me7SegmentDisplay seg; +MePort generalDevice; +MeInfraredReceiver *ir = NULL; +MeGyro gyro; +MeJoystick joystick; +MeStepper steppers[2]; +MeBuzzer buzzer; +MeHumiture humiture; +MeFlameSensor FlameSensor; +MeGasSensor GasSensor; +MeTouchSensor touchSensor; +Me4Button buttonSensor; + +typedef struct MeModule +{ + int device; + int port; + int slot; + int pin; + int index; + float values[3]; +} MeModule; + +union{ + byte byteVal[4]; + float floatVal; + long longVal; +}val; + +union{ + byte byteVal[8]; + double doubleVal; +}valDouble; + +union{ + byte byteVal[2]; + short shortVal; +}valShort; +MeModule modules[12]; +#if defined(__AVR_ATmega32U4__) + int analogs[12]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11}; +#endif +#if defined(__AVR_ATmega328P__) or defined(__AVR_ATmega168__) + int analogs[8]={A0,A1,A2,A3,A4,A5,A6,A7}; + MeEncoderMotor encoders[2]; +#endif +#if defined(__AVR_ATmega1280__)|| defined(__AVR_ATmega2560__) + int analogs[16]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15}; +#endif +String mVersion = "0a.01.106"; +boolean isAvailable = false; +boolean isBluetooth = false; + +int len = 52; +char buffer[52]; +char bufferBt[52]; +byte index = 0; +byte dataLen; +byte modulesLen=0; +boolean isStart = false; +unsigned char irRead; +char serialRead; +#define VERSION 0 +#define ULTRASONIC_SENSOR 1 +#define TEMPERATURE_SENSOR 2 +#define LIGHT_SENSOR 3 +#define POTENTIONMETER 4 +#define JOYSTICK 5 +#define GYRO 6 +#define SOUND_SENSOR 7 +#define RGBLED 8 +#define SEVSEG 9 +#define MOTOR 10 +#define SERVO 11 +#define ENCODER 12 +#define IR 13 +#define IRREMOTE 14 +#define PIRMOTION 15 +#define INFRARED 16 +#define LINEFOLLOWER 17 +#define IRREMOTECODE 18 +#define SHUTTER 20 +#define LIMITSWITCH 21 +#define BUTTON 22 +#define HUMITURE 23 +#define FLAMESENSOR 24 +#define GASSENSOR 25 +#define COMPASS 26 +#define DIGITAL 30 +#define ANALOG 31 +#define PWM 32 +#define SERVO_PIN 33 +#define TONE 34 +#define PULSEIN 37 +#define ULTRASONIC_ARDUINO 36 +#define STEPPER 40 +#define LEDMATRIX 41 +#define TIMER 50 +#define TOUCH_SENSOR 51 + +#define GET 1 +#define RUN 2 +#define RESET 4 +#define START 5 +float angleServo = 90.0; +int servo_pins[8]={0,0,0,0,0,0,0,0}; +unsigned char prevc=0; +double lastTime = 0.0; +double currentTime = 0.0; +uint8_t keyPressed = 0; +uint8_t command_index = 0; + +void setup(){ + pinMode(13,OUTPUT); + digitalWrite(13,HIGH); + delay(300); + digitalWrite(13,LOW); + Serial.begin(115200); + delay(500); + buzzerOn(); + delay(100); + buzzerOff(); + #if defined(__AVR_ATmega328P__) or defined(__AVR_ATmega168__) + encoders[0] = MeEncoderMotor(SLOT_1); + encoders[1] = MeEncoderMotor(SLOT_2); + encoders[0].begin(); + encoders[1].begin(); + delay(500); + encoders[0].runSpeed(0); + encoders[1].runSpeed(0); + #else + Serial1.begin(115200); + #endif + gyro.begin(); + Serial.print("Version: "); + Serial.println(mVersion); +} +void loop(){ + keyPressed = buttonSensor.pressed(); + currentTime = millis()/1000.0-lastTime; + if(ir != NULL) + { + ir->loop(); + } + readSerial(); + steppers[0].runSpeedToPosition(); + steppers[1].runSpeedToPosition(); + if(isAvailable){ + unsigned char c = serialRead&0xff; + if(c==0x55&&isStart==false){ + if(prevc==0xff){ + index=1; + isStart = true; + } + }else{ + prevc = c; + if(isStart){ + if(index==2){ + dataLen = c; + }else if(index>2){ + dataLen--; + } + writeBuffer(index,c); + } + } + index++; + if(index>51){ + index=0; + isStart=false; + } + if(isStart&&dataLen==0&&index>3){ + isStart = false; + parseData(); + index=0; + } + } +} +unsigned char readBuffer(int index){ + return isBluetooth?bufferBt[index]:buffer[index]; +} +void writeBuffer(int index,unsigned char c){ + if(isBluetooth){ + bufferBt[index]=c; + }else{ + buffer[index]=c; + } +} +void writeHead(){ + writeSerial(0xff); + writeSerial(0x55); +} +void writeEnd(){ + Serial.println(); + #if defined(__AVR_ATmega32U4__) + Serial1.println(); + #endif +} +void writeSerial(unsigned char c){ + Serial.write(c); + #if defined(__AVR_ATmega32U4__) + Serial1.write(c); + #endif +} +void readSerial(){ + isAvailable = false; + if(Serial.available()>0){ + isAvailable = true; + isBluetooth = false; + serialRead = Serial.read(); + } +//#if defined(__AVR_ATmega32U4__) +// if(Serial1.available()>0){ +// isAvailable = true; +// isBluetooth = false; +// serialRead = Serial1.read(); +// } +// #endif +} +/* +ff 55 len idx action device port slot data a +0 1 2 3 4 5 6 7 8 +*/ +void parseData(){ + isStart = false; + int idx = readBuffer(3); + command_index = (uint8_t)idx; + int action = readBuffer(4); + int device = readBuffer(5); + switch(action){ + case GET:{ + if(device != ULTRASONIC_SENSOR){ + writeHead(); + writeSerial(idx); + } + readSensor(device); + writeEnd(); + } + break; + case RUN:{ + runModule(device); + callOK(); + } + break; + case RESET:{ + //reset + dc.reset(M1); + dc.run(0); + dc.reset(M2); + dc.run(0); + dc.reset(PORT_1); + dc.run(0); + dc.reset(PORT_2); + dc.run(0); + + #if defined(__AVR_ATmega328P__) + encoders[0].runSpeed(0); + encoders[1].runSpeed(0); + #endif + callOK(); + } + break; + case START:{ + //start + callOK(); + } + break; + } +} +void callOK(){ + writeSerial(0xff); + writeSerial(0x55); + writeEnd(); +} +void sendByte(char c){ + writeSerial(1); + writeSerial(c); +} +void sendString(String s){ + int l = s.length(); + writeSerial(4); + writeSerial(l); + for(int i=0;i0) + { + led.setColorAt(idx-1,r,g,b); + } + else + { + led.setColor(r,g,b); + } + led.show(); + } + break; + case SERVO:{ + int slot = readBuffer(7); + pin = slot==1?mePort[port].s1:mePort[port].s2; + int v = readBuffer(8); + Servo sv = servos[searchServoPin(pin)]; + if(v >= 0 && v <= 180) + { + if(!sv.attached()) + { + sv.attach(pin); + } + sv.write(v); + } + } + break; + case SEVSEG:{ + if(seg.getPort()!=port){ + seg.reset(port); + } + float v = readFloat(7); + seg.display(v); + } + break; + case LIGHT_SENSOR:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + } + int v = readBuffer(7); + generalDevice.dWrite1(v); + } + break; + case SHUTTER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + } + int v = readBuffer(7); + if(v<2){ + generalDevice.dWrite1(v); + }else{ + generalDevice.dWrite2(v-2); + } + } + break; + case DIGITAL:{ + pinMode(pin,OUTPUT); + int v = readBuffer(7); + digitalWrite(pin,v); + } + break; + case PWM:{ + pinMode(pin,OUTPUT); + int v = readBuffer(7); + analogWrite(pin,v); + } + break; + case TONE:{ + pinMode(pin,OUTPUT); + int hz = readShort(7); + int ms = readShort(9); + if(ms>0){ + buzzer.tone(pin, hz, ms); + }else{ + buzzer.noTone(pin); + } + } + break; + case SERVO_PIN:{ + int v = readBuffer(7); + Servo sv = servos[searchServoPin(pin)]; + if(v >= 0 && v <= 180) + { + if(!sv.attached()) + { + sv.attach(pin); + } + sv.write(v); + } + } + break; + case TIMER:{ + lastTime = millis()/1000.0; + } + break; + } +} + +int searchServoPin(int pin){ + for(int i=0;i<8;i++){ + if(servo_pins[i] == pin){ + return i; + } + if(servo_pins[i]==0){ + servo_pins[i] = pin; + return i; + } + } + return 0; +} +void readSensor(int device){ + /************************************************** + ff 55 len idx action device port slot data a + 0 1 2 3 4 5 6 7 8 + ***************************************************/ + float value=0.0; + int port,slot,pin; + port = readBuffer(6); + pin = port; + switch(device){ + case ULTRASONIC_SENSOR:{ + if(us.getPort()!=port){ + us.reset(port); + } + value = us.distanceCm(); + writeHead(); + writeSerial(command_index); + sendFloat(value); + } + break; + case TEMPERATURE_SENSOR:{ + slot = readBuffer(7); + if(ts.getPort()!=port||ts.getSlot()!=slot){ + ts.reset(port,slot); + } + value = ts.temperature(); + sendFloat(value); + } + break; + case LIGHT_SENSOR: + case SOUND_SENSOR: + case POTENTIONMETER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.aRead2(); + sendFloat(value); + } + break; + case JOYSTICK:{ + slot = readBuffer(7); + if(joystick.getPort() != port){ + joystick.reset(port); + } + value = joystick.read(slot); + sendFloat(value); + } + break; + case INFRARED: + { + if(ir == NULL) + { + ir = new MeInfraredReceiver(port); + ir->begin(); + } + else if(ir->getPort() != port) + { + delete ir; + ir = new MeInfraredReceiver(port); + ir->begin(); + } + irRead = ir->getCode(); + if((irRead < 255) && (irRead > 0)) + { + sendFloat((float)irRead); + } + else + { + sendFloat(0); + } + } + break; + case PIRMOTION:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead2(); + sendFloat(value); + } + break; + case LINEFOLLOWER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin1(),INPUT); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead1()*2+generalDevice.dRead2(); + sendFloat(value); + } + break; + case LIMITSWITCH:{ + slot = readBuffer(7); + if(generalDevice.getPort()!=port||generalDevice.getSlot()!=slot){ + generalDevice.reset(port,slot); + } + if(slot==1){ + pinMode(generalDevice.pin1(),INPUT_PULLUP); + value = !generalDevice.dRead1(); + }else{ + pinMode(generalDevice.pin2(),INPUT_PULLUP); + value = !generalDevice.dRead2(); + } + sendFloat(value); + } + break; +// case COMPASS:{ +// if(Compass.getPort()!=port){ +// Compass.reset(port); +// Compass.setpin(Compass.pin1(),Compass.pin2()); +// } +// double CompassAngle; +// CompassAngle = Compass.getAngle(); +// sendDouble(CompassAngle); +// } +// break; + case HUMITURE:{ + uint8_t index = readBuffer(7); + if(humiture.getPort()!=port){ + humiture.reset(port); + } + uint8_t HumitureData; + humiture.update(); + HumitureData = humiture.getValue(index); + sendByte(HumitureData); + } + break; + case FLAMESENSOR:{ + if(FlameSensor.getPort()!=port){ + FlameSensor.reset(port); + FlameSensor.setpin(FlameSensor.pin2(),FlameSensor.pin1()); + } + int16_t FlameData; + FlameData = FlameSensor.readAnalog(); + sendShort(FlameData); + } + break; + case GASSENSOR:{ + if(GasSensor.getPort()!=port){ + GasSensor.reset(port); + GasSensor.setpin(GasSensor.pin2(),GasSensor.pin1()); + } + int16_t GasData; + GasData = GasSensor.readAnalog(); + sendShort(GasData); + } + break; + case GYRO:{ + int axis = readBuffer(7); + gyro.update(); + if(axis == 1){ + value = gyro.getAngleX(); + sendFloat(value); + }else if(axis == 2){ + value = gyro.getAngleY(); + sendFloat(value); + }else if(axis == 3){ + value = gyro.getAngleZ(); + sendFloat(value); + } + } + break; + case VERSION:{ + sendString(mVersion); + } + break; + case DIGITAL:{ + pinMode(pin,INPUT); + sendFloat(digitalRead(pin)); + } + break; + case ANALOG:{ + pin = analogs[pin]; + pinMode(pin,INPUT); + sendFloat(analogRead(pin)); + } + break; + case PULSEIN:{ + int pw = readShort(7); + pinMode(pin, INPUT); + sendShort(pulseIn(pin,HIGH,pw)); + } + break; + case ULTRASONIC_ARDUINO:{ + int trig = readBuffer(6); + int echo = readBuffer(7); + pinMode(trig,OUTPUT); + digitalWrite(trig,LOW); + delayMicroseconds(2); + digitalWrite(trig,HIGH); + delayMicroseconds(10); + digitalWrite(trig,LOW); + pinMode(echo, INPUT); + sendFloat(pulseIn(echo,HIGH,30000)/58.0); + } + break; + case TIMER:{ + sendFloat((float)currentTime); + } + break; + case TOUCH_SENSOR: + { + if(touchSensor.getPort() != port){ + touchSensor.reset(port); + } + sendByte(touchSensor.touched()); + } + break; + case BUTTON: + { + if(buttonSensor.getPort() != port){ + buttonSensor.reset(port); + } + sendByte(keyPressed == readBuffer(7)); + } + break; + } +} diff --git a/Makeblock-Libraries-master/examples/Firmware_For_mBlock/shield_firmware/shield_firmware.ino b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/shield_firmware/shield_firmware.ino new file mode 100644 index 0000000..ce64746 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_For_mBlock/shield_firmware/shield_firmware.ino @@ -0,0 +1,736 @@ +/************************************************************************* +* File Name : shield_firmware.ino +* Author : Ander, Mark Yan +* Updated : Ander, Mark Yan +* Version : V0c.01.105 +* Date : 07/06/2016 +* Description : Firmware for Makeblock Electronic modules with Scratch. +* License : CC-BY-SA 3.0 +* Copyright (C) 2013 - 2016 Maker Works Technology Co., Ltd. All right reserved. +* http://www.makeblock.cc/ +**************************************************************************/ +#include +#include +#include +#include + +Servo servos[8]; +MeDCMotor dc; +MeTemperature ts; +MeRGBLed led; +MeUltrasonicSensor us; +Me7SegmentDisplay seg; +MePort generalDevice; +MeInfraredReceiver *ir = NULL; +MeGyro gyro; +MeJoystick joystick; +MeStepper steppers[4]; +MeBuzzer buzzer; +MeHumiture humiture; +MeFlameSensor FlameSensor; +MeGasSensor GasSensor; +MeTouchSensor touchSensor; +Me4Button buttonSensor; + +typedef struct MeModule +{ + int device; + int port; + int slot; + int pin; + int index; + float values[3]; +} MeModule; + +union{ + byte byteVal[4]; + float floatVal; + long longVal; +}val; + +union{ + byte byteVal[8]; + double doubleVal; +}valDouble; + +union{ + byte byteVal[2]; + short shortVal; +}valShort; +MeModule modules[12]; +#if defined(__AVR_ATmega32U4__) + int analogs[12]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11}; +#endif +#if defined(__AVR_ATmega328P__) or defined(__AVR_ATmega168__) + int analogs[8]={A0,A1,A2,A3,A4,A5,A6,A7}; + MeEncoderMotor encoders[2]; +#endif +#if defined(__AVR_ATmega1280__)|| defined(__AVR_ATmega2560__) + int analogs[16]={A0,A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15}; +#endif +String mVersion = "0c.01.105"; +boolean isAvailable = false; +boolean isBluetooth = false; + +int len = 52; +char buffer[52]; +char bufferBt[52]; +byte index = 0; +byte dataLen; +byte modulesLen=0; +boolean isStart = false; +unsigned char irRead; +char serialRead; +#define VERSION 0 +#define ULTRASONIC_SENSOR 1 +#define TEMPERATURE_SENSOR 2 +#define LIGHT_SENSOR 3 +#define POTENTIONMETER 4 +#define JOYSTICK 5 +#define GYRO 6 +#define SOUND_SENSOR 7 +#define RGBLED 8 +#define SEVSEG 9 +#define MOTOR 10 +#define SERVO 11 +#define ENCODER 12 +#define IR 13 +#define IRREMOTE 14 +#define PIRMOTION 15 +#define INFRARED 16 +#define LINEFOLLOWER 17 +#define IRREMOTECODE 18 +#define SHUTTER 20 +#define LIMITSWITCH 21 +#define BUTTON 22 +#define HUMITURE 23 +#define FLAMESENSOR 24 +#define GASSENSOR 25 +#define COMPASS 26 +#define DIGITAL 30 +#define ANALOG 31 +#define PWM 32 +#define SERVO_PIN 33 +#define TONE 34 +#define PULSEIN 37 +#define ULTRASONIC_ARDUINO 36 +#define STEPPER 40 +#define LEDMATRIX 41 +#define TIMER 50 +#define TOUCH_SENSOR 51 + +#define GET 1 +#define RUN 2 +#define RESET 4 +#define START 5 +float angleServo = 90.0; +int servo_pins[8]={0,0,0,0,0,0,0,0}; +unsigned char prevc=0; +double lastTime = 0.0; +double currentTime = 0.0; +uint8_t keyPressed = 0; +uint8_t command_index = 0; + +void setup(){ + pinMode(13,OUTPUT); + digitalWrite(13,HIGH); + delay(300); + digitalWrite(13,LOW); + Serial.begin(115200); + delay(500); + buzzerOn(); + delay(100); + buzzerOff(); + #if defined(__AVR_ATmega328P__) or defined(__AVR_ATmega168__) + encoders[0] = MeEncoderMotor(SLOT_1); + encoders[1] = MeEncoderMotor(SLOT_2); + encoders[0].begin(); + encoders[1].begin(); + delay(500); + encoders[0].runSpeed(0); + encoders[1].runSpeed(0); + #else + Serial1.begin(115200); + #endif + gyro.begin(); + Serial.print("Version: "); + Serial.println(mVersion); +} +void loop(){ + keyPressed = buttonSensor.pressed(); + currentTime = millis()/1000.0-lastTime; + if(ir != NULL) + { + ir->loop(); + } + readSerial(); + steppers[0].runSpeedToPosition(); + steppers[1].runSpeedToPosition(); + steppers[2].runSpeedToPosition(); + steppers[3].runSpeedToPosition(); + if(isAvailable){ + unsigned char c = serialRead&0xff; + if(c==0x55&&isStart==false){ + if(prevc==0xff){ + index=1; + isStart = true; + } + }else{ + prevc = c; + if(isStart){ + if(index==2){ + dataLen = c; + }else if(index>2){ + dataLen--; + } + writeBuffer(index,c); + } + } + index++; + if(index>51){ + index=0; + isStart=false; + } + if(isStart&&dataLen==0&&index>3){ + isStart = false; + parseData(); + index=0; + } + } +} +unsigned char readBuffer(int index){ + return isBluetooth?bufferBt[index]:buffer[index]; +} +void writeBuffer(int index,unsigned char c){ + if(isBluetooth){ + bufferBt[index]=c; + }else{ + buffer[index]=c; + } +} +void writeHead(){ + writeSerial(0xff); + writeSerial(0x55); +} +void writeEnd(){ + Serial.println(); + #if defined(__AVR_ATmega32U4__) + Serial1.println(); + #endif +} +void writeSerial(unsigned char c){ + Serial.write(c); + #if defined(__AVR_ATmega32U4__) + Serial1.write(c); + #endif +} +void readSerial(){ + isAvailable = false; + if(Serial.available()>0){ + isAvailable = true; + isBluetooth = false; + serialRead = Serial.read(); + } +//#if defined(__AVR_ATmega32U4__) +// if(Serial1.available()>0){ +// isAvailable = true; +// isBluetooth = false; +// serialRead = Serial1.read(); +// } +// #endif +} +/* +ff 55 len idx action device port slot data a +0 1 2 3 4 5 6 7 8 +*/ +void parseData(){ + isStart = false; + int idx = readBuffer(3); + command_index = (uint8_t)idx; + int action = readBuffer(4); + int device = readBuffer(5); + switch(action){ + case GET:{ + if(device != ULTRASONIC_SENSOR){ + writeHead(); + writeSerial(idx); + } + readSensor(device); + writeEnd(); + } + break; + case RUN:{ + runModule(device); + callOK(); + } + break; + case RESET:{ + //reset + dc.reset(M1); + dc.run(0); + dc.reset(M2); + dc.run(0); + dc.reset(PORT_1); + dc.run(0); + dc.reset(PORT_2); + dc.run(0); + + #if defined(__AVR_ATmega328P__) + encoders[0].runSpeed(0); + encoders[1].runSpeed(0); + #endif + callOK(); + } + break; + case START:{ + //start + callOK(); + } + break; + } +} +void callOK(){ + writeSerial(0xff); + writeSerial(0x55); + writeEnd(); +} +void sendByte(char c){ + writeSerial(1); + writeSerial(c); +} +void sendString(String s){ + int l = s.length(); + writeSerial(4); + writeSerial(l); + for(int i=0;i0){ + led.setColorAt(idx-1,r,g,b); + }else{ + led.setColor(r,g,b); + } + led.show(); + } + break; + case SERVO:{ + int slot = readBuffer(7); + pin = slot==1?mePort[port].s1:mePort[port].s2; + int v = readBuffer(8); + Servo sv = servos[searchServoPin(pin)]; + if(v>=0&&v<=180){ + if(port>0){ + sv.attach(pin); + }else{ + sv.attach(pin); + } + sv.write(v); + } + } + break; + case SEVSEG:{ + if(seg.getPort()!=port){ + seg.reset(port); + } + float v = readFloat(7); + seg.display(v); + } + break; + case LIGHT_SENSOR:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + } + int v = readBuffer(7); + generalDevice.dWrite1(v); + } + break; + case SHUTTER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + } + int v = readBuffer(7); + if(v<2){ + generalDevice.dWrite1(v); + }else{ + generalDevice.dWrite2(v-2); + } + } + break; + case DIGITAL:{ + pinMode(pin,OUTPUT); + int v = readBuffer(7); + digitalWrite(pin,v); + } + break; + case PWM:{ + pinMode(pin,OUTPUT); + int v = readBuffer(7); + analogWrite(pin,v); + } + break; + case TONE:{ + pinMode(pin,OUTPUT); + int hz = readShort(7); + int ms = readShort(9); + if(ms>0){ + buzzer.tone(pin, hz, ms); + }else{ + buzzer.noTone(pin); + } + } + break; + case SERVO_PIN:{ + int v = readBuffer(7); + if(v>=0&&v<=180){ + Servo sv = servos[searchServoPin(pin)]; + sv.attach(pin); + sv.write(v); + } + } + break; + case TIMER:{ + lastTime = millis()/1000.0; + } + break; + } +} + +int searchServoPin(int pin){ + for(int i=0;i<8;i++){ + if(servo_pins[i] == pin){ + return i; + } + if(servo_pins[i]==0){ + servo_pins[i] = pin; + return i; + } + } + return 0; +} +void readSensor(int device){ + /************************************************** + ff 55 len idx action device port slot data a + 0 1 2 3 4 5 6 7 8 + ***************************************************/ + float value=0.0; + int port,slot,pin; + port = readBuffer(6); + pin = port; + switch(device){ + case ULTRASONIC_SENSOR:{ + if(us.getPort()!=port){ + us.reset(port); + } + value = us.distanceCm(); + writeHead(); + writeSerial(command_index); + sendFloat(value); + } + break; + case TEMPERATURE_SENSOR:{ + slot = readBuffer(7); + if(ts.getPort()!=port||ts.getSlot()!=slot){ + ts.reset(port,slot); + } + value = ts.temperature(); + sendFloat(value); + } + break; + case LIGHT_SENSOR: + case SOUND_SENSOR: + case POTENTIONMETER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.aRead2(); + sendFloat(value); + } + break; + case JOYSTICK:{ + slot = readBuffer(7); + if(joystick.getPort() != port){ + joystick.reset(port); + } + value = joystick.read(slot); + sendFloat(value); + } + break; + case INFRARED: + { + if(ir == NULL) + { + ir = new MeInfraredReceiver(port); + ir->begin(); + } + else if(ir->getPort() != port) + { + delete ir; + ir = new MeInfraredReceiver(port); + ir->begin(); + } + irRead = ir->getCode(); + if((irRead < 255) && (irRead > 0)) + { + sendFloat((float)irRead); + } + else + { + sendFloat(0); + } + } + break; + case PIRMOTION:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead2(); + sendFloat(value); + } + break; + case LINEFOLLOWER:{ + if(generalDevice.getPort()!=port){ + generalDevice.reset(port); + pinMode(generalDevice.pin1(),INPUT); + pinMode(generalDevice.pin2(),INPUT); + } + value = generalDevice.dRead1()*2+generalDevice.dRead2(); + sendFloat(value); + } + break; + case LIMITSWITCH:{ + slot = readBuffer(7); + if(generalDevice.getPort()!=port||generalDevice.getSlot()!=slot){ + generalDevice.reset(port,slot); + } + if(slot==1){ + pinMode(generalDevice.pin1(),INPUT_PULLUP); + value = !generalDevice.dRead1(); + }else{ + pinMode(generalDevice.pin2(),INPUT_PULLUP); + value = !generalDevice.dRead2(); + } + sendFloat(value); + } + break; +// case COMPASS:{ +// if(Compass.getPort()!=port){ +// Compass.reset(port); +// Compass.setpin(Compass.pin1(),Compass.pin2()); +// } +// double CompassAngle; +// CompassAngle = Compass.getAngle(); +// sendDouble(CompassAngle); +// } +// break; + case HUMITURE:{ + uint8_t index = readBuffer(7); + if(humiture.getPort()!=port){ + humiture.reset(port); + } + uint8_t HumitureData; + humiture.update(); + HumitureData = humiture.getValue(index); + sendByte(HumitureData); + } + break; + case FLAMESENSOR:{ + if(FlameSensor.getPort()!=port){ + FlameSensor.reset(port); + FlameSensor.setpin(FlameSensor.pin2(),FlameSensor.pin1()); + } + int16_t FlameData; + FlameData = FlameSensor.readAnalog(); + sendShort(FlameData); + } + break; + case GASSENSOR:{ + if(GasSensor.getPort()!=port){ + GasSensor.reset(port); + GasSensor.setpin(GasSensor.pin2(),GasSensor.pin1()); + } + int16_t GasData; + GasData = GasSensor.readAnalog(); + sendShort(GasData); + } + break; + case GYRO:{ + int axis = readBuffer(7); + gyro.update(); + if(axis == 1){ + value = gyro.getAngleX(); + sendFloat(value); + }else if(axis == 2){ + value = gyro.getAngleY(); + sendFloat(value); + }else if(axis == 3){ + value = gyro.getAngleZ(); + sendFloat(value); + } + } + break; + case VERSION:{ + sendString(mVersion); + } + break; + case DIGITAL:{ + pinMode(pin,INPUT); + sendFloat(digitalRead(pin)); + } + break; + case ANALOG:{ + pin = analogs[pin]; + pinMode(pin,INPUT); + sendFloat(analogRead(pin)); + } + break; + case PULSEIN:{ + int pw = readShort(7); + pinMode(pin, INPUT); + sendShort(pulseIn(pin,HIGH,pw)); + } + break; + case ULTRASONIC_ARDUINO:{ + int trig = readBuffer(6); + int echo = readBuffer(7); + pinMode(trig,OUTPUT); + digitalWrite(trig,LOW); + delayMicroseconds(2); + digitalWrite(trig,HIGH); + delayMicroseconds(10); + digitalWrite(trig,LOW); + pinMode(echo, INPUT); + sendFloat(pulseIn(echo,HIGH,30000)/58.0); + } + break; + case TIMER:{ + sendFloat((float)currentTime); + } + break; + case TOUCH_SENSOR: + { + if(touchSensor.getPort() != port){ + touchSensor.reset(port); + } + sendByte(touchSensor.touched()); + } + break; + case BUTTON: + { + if(buttonSensor.getPort() != port){ + buttonSensor.reset(port); + } + sendByte(keyPressed == readBuffer(7)); + } + break; + } +} diff --git a/Makeblock-Libraries-master/examples/Firmware_for_Auriga/Firmware_for_Auriga.ino b/Makeblock-Libraries-master/examples/Firmware_for_Auriga/Firmware_for_Auriga.ino new file mode 100644 index 0000000..4596391 --- /dev/null +++ b/Makeblock-Libraries-master/examples/Firmware_for_Auriga/Firmware_for_Auriga.ino @@ -0,0 +1,3236 @@ +/************************************************************************* +* File Name : Firmware_for_Auriga.ino +* Author : myan +* Updated : myan +* Version : V09.01.016 +* Date : 21/06/2017 +* Description : Firmware for Makeblock Electronic modules with Scratch. +* License : CC-BY-SA 3.0 +* Copyright (C) 2013 - 2016 Maker Works Technology Co., Ltd. All right reserved. +* http://www.makeblock.cc/ +* History: +*