|
我的机器人被雨淋湿了,它被烧焦了。我用粒子,STM32开发板和Adacore破解了它。
在这个项目中使用的东西 硬件组件 粒子光子 ×1 我是机器人 ×1 STM32-H407 ×1 Raspberry Pi 3型号B. × 1 粒子电子 ×1 软件应用程序和在线服务 粒子构建Web IDE Android Studio Qualicom数学库 远程XY 手动工具和制造机器 烙铁(通用) ** *******注意************ 这是迄今为止我尝试过的最雄心勃勃的项目。
基本数据和控制流程 当我发现我的iRobot因雨而受损时,我打开它并清理掉它的腐蚀,并设法修复了电路板的充电部分,然后完好无损。 我测量了电机,发现驱动电机的正负部分在哪里。然后我将电线焊接到接线柱和电池的正极和负极上。 前往绘图板并设计一个安装在iRobot Body顶部的护罩。粒子由iRobot供电,因此功率不是问题。主要问题是设计一个正向和反向屏蔽,因为(负面和正面)需要反转,使电机向后移动,这也是机器转向的方式。附上设计原理图。 该项目将分多步进行 1. iRobot电机控制与编程 a.板的设计和焊接 b.粒子规划和结点红 2. 用AdaCore编程实现自动化控制 a.机器学习与粒子集成 b.使用Adacore进行机器学习编程 c。程序运行 3.视频 现在的项目
iRobot胆线焊接电线
1轮控制电路基本原理图 要反转直流电机方向,您需要同时反转电机的负极和正极。并且在进行连接之前需要先断开以防止短路和大火花。 如上图所示,不需要D1和D3,因为激活电路与控制电路分开,NPN晶体管将接触器与控制器隔离。 1A。电路板设计和焊接 我正在使用2个继电器,每个继电器用于驱动每个车轮的正向反向(我的继电器只有单个NO和NC带有公共端),另一个继电器作为激活继电器,它将驱动刷子并启动电机。电路中的二极管和电容器可防止电机中电刷的火花和短路。 中继板
完成的板
板顶无铜线层可以看到布线 为了最终确定电路板,我添加了一个+ 5VDC USB输出,为操纵杆板上的Electron电池充电。 我正在使用粒子文档中有关发布和订阅以及传感器板上的粒子功能的示例。 这是PCBway.com 的原始板
来自PCBway.com 的原始板 这是成品板。 焊接和测试主板
遥控器如下。我设计遥控器使用另一个粒子和操纵杆,但iPhone或iPad也可以使用应用程序。(可能会跟随)。
iRobot使用不同的板来测试继电器 传感器板
前传感器板 这是来自pcbway.com 的原始板
我添加了一个跳线引脚装置,已说明RGB LED的类型 这是完成的板
没有超声波传感器
使用超声波传感器
这是完成的控制线路。 1B。粒子编程和节点红 我不仅在自动化编程,而且我还添加了远程控制功能。这将有助于自动化和机器学习。 我认为项目中最困难的部分是编程部分。我打算使用操纵杆和另一个粒子远程驱动设备。 我正在使用粒子文档中有关发布和订阅以及粒子函数的示例。 http://docs.particle.io 我正在使用这个将被大量修改的示例 当我按照我的方式构建它时,我将发布这个帖子。因此,我可能会对编程和设计进行一些更改。 iRobot粒子代码(下载最终代码) #include<Particle-GPS.h> #include"DS18.h" #include<math.h> #include<MPU6050.h> #include<I2Cdev.h> #include<Particle.h> #include"Adafruit_MPL3115A2.h" #include"Particle.h" #defineLTCADDR1 0x69//Table 1 both LOW (7bit address)Feed #defineLTCADDR2 0x67//Table 1 both LOW (7bit address)Circuit1 #defineLTCADDR3 0x6f//Table 1 both LOW (7bit address)Circuit2 #define sda D0 #define scl D1 #define Relay1D2 #define Relay2D3 #define Relay3D4 int d2=2; //----------------------------------- #definetrigPin1 A5 #defineechoPin1 A4 #define LEDR A1 //#define led210 #definetrigPin2 A3 #defineechoPin2 A2 #define LEDG A0 #define LEDB 7 //----------------------------------- int Left; int Right; //---------------------------------- byte ADCvinMSB, ADCvinLSB, curSenseMSB, curSenseLSB, AinVMSB,AinVLSB; unsigned int ADCvin, ADCcur, AinV; //floatinputVoltage1, current0p01; float inputVoltage2, current0p02; float inputVoltage3, ADCvoltage, current103, current3,current0p3, current0p03; float inputVoltage1, current10, current1, current0p1, current0p01; int set_port = 1; int incomingByte = 0; Adafruit_MPL3115A2baro = Adafruit_MPL3115A2(); //======================================== SYSTEM_THREAD(ENABLED); // Global const long interval = 10000; // interval at which to Read Sensors ( in milliseconds) unsigned long previousMillis = 0; // Stores thetime of last reading DS18sensor(D5); Gps _gps =Gps(&Serial1); Timer _timer =Timer(1, onSerialData); void setup() { Serial.begin(9600); baro.begin(); //Particle.function("Solar",Reset); //Particle.function("Fan",Fan); //Particle.function("Radio",Radio); Particle.function("ON", MotorOn); Particle.function("Left", MotorLeft); Particle.function("Right", MotorRight); Particle.function("Forward", MotorOn); Particle.function("Back", MotorBack); pinMode(D6, OUTPUT); pinMode(D2, OUTPUT); pinMode(D3, OUTPUT); pinMode(D4, OUTPUT); digitalWrite(D2 ,LOW); digitalWrite(D3 ,LOW); digitalWrite(D4 ,LOW); Wire.begin(); delay(1000); //baro.begin(); byte error, address; int nDevices; Serial.println("Initializing..."); _gps.begin(9600); _timer.start(); //----------------------------------- pinMode(trigPin1, OUTPUT); pinMode(echoPin1, INPUT); pinMode(LEDG, OUTPUT); pinMode(trigPin2, OUTPUT); pinMode(echoPin2, INPUT); pinMode(LEDR, OUTPUT); pinMode(LEDB, OUTPUT); //----------------------------------- } void onSerialData() { _gps.onSerialData(); } void loop() { char message[120]; char data1[256]; size_t data_used; int sensorValue; int status; int8_t result; char message1[120]; if (millis() - previousMillis >= (interval )) { Wire.beginTransmission(LTCADDR1);//first get InputVoltage - 80V max Wire.write(0x1E); Wire.endTransmission(false); Wire.requestFrom(LTCADDR1, 2, true); delay(1); ADCvinMSB = Wire.read(); ADCvinLSB = Wire.read(); ADCvin = ((unsigned int)(ADCvinMSB) << 4) + ((ADCvinLSB >> 4) & 0x0F);//formats into 12bit integer inputVoltage1 = ADCvin * 0.025; //25mV resolution Wire.beginTransmission(LTCADDR3);//get ADC Input 2V max Wire.write(0x28); Wire.endTransmission(false); Wire.requestFrom(LTCADDR3, 2, true); delay(1); AinVMSB = Wire.read(); AinVLSB = Wire.read(); AinV = ((unsigned int)(AinVMSB) << 4) + ((AinVLSB >> 4) & 0x0F);//12 bit format ADCvoltage = AinV * 0.5E-3; //500uVresolution Wire.beginTransmission(LTCADDR3);//get sense current Wire.write(0x14); Wire.endTransmission(false); Wire.requestFrom(LTCADDR1, 2, true); delay(1); curSenseMSB = Wire.read(); curSenseLSB = Wire.read(); ADCcur = ((unsigned int)(curSenseMSB) << 4) + ((curSenseLSB >> 4) & 0x0F);//12 bit format //gets voltage across,25uV resolution, then this converts to voltage for each sense resistor current10 = ADCcur * (25E-3) / 10.0; //10mA max, unitis mA current1 = ADCcur * (25E-3) / 1.0; //100mA max,unit is mA current0p1 = ADCcur * (25E-3) / 0.1; //1A max, unit is mA current0p01 = ADCcur * (25E-6) / 0.01;//10A max, unit is A //=========================================================================================== Wire.beginTransmission(LTCADDR2);//first get InputVoltage - 80V max Wire.write(0x1E); Wire.endTransmission(false); Wire.requestFrom(LTCADDR2, 2, true); delay(1); ADCvinMSB = Wire.read(); ADCvinLSB = Wire.read(); ADCvin = ((unsigned int)(ADCvinMSB) << 4) + ((ADCvinLSB >> 4) & 0x0F);//formats into 12bit integer inputVoltage2 = ADCvin * 0.025; //25mV resolution Wire.beginTransmission(LTCADDR2);//get ADC Input 2V max Wire.write(0x28); Wire.endTransmission(false); Wire.requestFrom(LTCADDR2, 2, true); delay(1); AinVMSB = Wire.read(); AinVLSB = Wire.read(); AinV = ((unsigned int)(AinVMSB) << 4) + ((AinVLSB >> 4) & 0x0F);//12 bit format ADCvoltage = AinV * 0.5E-3; //500uVresolution Wire.beginTransmission(LTCADDR2);//get sense current Wire.write(0x14); Wire.endTransmission(false); Wire.requestFrom(LTCADDR1, 2, true); delay(1); curSenseMSB = Wire.read(); curSenseLSB = Wire.read(); ADCcur = ((unsigned int)(curSenseMSB) << 4) + ((curSenseLSB >> 4) & 0x0F);//12 bit format //gets voltage across,25uV resolution, then this converts to voltage for each sense resistor current10 = ADCcur * (25E-3) / 10.0; //10mA max,unit is mA current1 = ADCcur * (25E-3) / 1.0; //100mA max,unit is mA current0p1 = ADCcur * (25E-3) / 0.1; //1A max, unit is mA current0p02 = ADCcur * (25E-6) / 0.01;//10A max, unit is A //============================================================================================ Wire.beginTransmission(LTCADDR3);//first get InputVoltage - 80V max Wire.write(0x1E); Wire.endTransmission(false); Wire.requestFrom(LTCADDR3, 2, true); delay(1); ADCvinMSB = Wire.read(); ADCvinLSB = Wire.read(); ADCvin = ((unsigned int)(ADCvinMSB) << 4) + ((ADCvinLSB >> 4) & 0x0F);//formats into 12bit integer inputVoltage3 = ADCvin * 0.025; //25mV resolution Wire.beginTransmission(LTCADDR3);//get ADC Input 2V max Wire.write(0x28); Wire.endTransmission(false); Wire.requestFrom(LTCADDR3, 2, true); delay(1); AinVMSB = Wire.read(); AinVLSB = Wire.read(); AinV = ((unsigned int)(AinVMSB) << 4) + ((AinVLSB >> 4) & 0x0F);//12 bit format ADCvoltage = AinV * 0.5E-3; //500uVresolution Wire.beginTransmission(LTCADDR3);//get sense current Wire.write(0x14); Wire.endTransmission(false); Wire.requestFrom(LTCADDR3, 2, true); delay(1); curSenseMSB = Wire.read(); curSenseLSB = Wire.read(); ADCcur = ((unsigned int)(curSenseMSB) << 4) + ((curSenseLSB >> 4) & 0x0F);//12 bit format current103 = ADCcur * (25E-3) / 10.0; //10mA max, unit is mA current3 = ADCcur * (25E-3) / 1.0; //100mA max,unit is mA current0p3 = ADCcur * (25E-3) / 0.1; //1A max, unit is mA current0p03 = ADCcur * (25E-6) / 0.01;//10A max, unit is A //=====================================Tempsensor sensor.read(); Serial.printf("Temperature %.2fC %.2f F ", sensor.celsius(),sensor.fahrenheit()); delay(1000); sprintf(message, "RC %f : RV %f : BL %f : BC %f : SLR %f : SCR %f : Temp %f",current0p03 ,inputVoltage3 ,inputVoltage2 ,current0p02,inputVoltage1 ,current0p01, sensor.celsius()); Particle.publish("String", message, PRIVATE); //=================================== Pgtop pgtop = Pgtop(_gps); if (pgtop.parse()) { Serial.println("1) AntennaStatus ($PGTOP)"); Serial.println("======================================================"); Serial.print("Command ID:"); Serial.println(pgtop.commandId); Serial.print("Antenna Status:"); Serial.println(pgtop.reference); Serial.println(""); } Gga gga = Gga(_gps); if (gga.parse()) { Serial.println("2) GlobalPositioning System Fixed Data ($GPGGA)"); Serial.println("======================================================"); Serial.print("UTC Time: "); Serial.println(gga.utcTime); Serial.print("Latitude: "); Serial.println(gga.latitude); Serial.print("North/SouthIndicator:"); Serial.println(gga.northSouthIndicator); Serial.print("Longitude:"); Serial.println(gga.longitude); Serial.print("East/WestIndicator:"); Serial.println(gga.eastWestIndicator); Serial.print("Position FixIndicator: "); Serial.println(gga.positionFixIndicator); Serial.print("Satellites Used:"); Serial.println(gga.satellitesUsed); Serial.print("HorizontalDilution of Precision: "); Serial.println(gga.hdop); Serial.print("Altitude: "); Serial.print(gga.altitude); Serial.print(" "); Serial.println(gga.altitudeUnit); Serial.print("GeoidalSeparation: "); Serial.print(gga.geoidalSeparation); Serial.print(" "); Serial.println(gga.geoidalSeparationUnit); Serial.print("Age of Diff.Corr.: "); Serial.println(gga.ageOfDiffCorr); Serial.println(""); const char* Latitude =(gga.latitude); // Particle.publish(("Latitude:"),Latitude, PRIVATE); // Particle.publish(("Longitude:"),(gga.longitude), PRIVATE); } Rmc rmc = Rmc(_gps); if (rmc.parse()) { Serial.println("3) RecommendedMinimum Navigation Information ($GPRMC)"); Serial.println("======================================================"); Serial.print("UTC Time: "); Serial.println(rmc.utcTime); Serial.print("Latitude: "); Serial.println(rmc.latitude); Serial.print("North/SouthIndicator:"); Serial.println(rmc.northSouthIndicator); Serial.print("Longitude:"); Serial.println(rmc.longitude); Serial.print("East/WestIndicator:"); Serial.println(rmc.eastWestIndicator); Serial.print("Speed OverGround: "); Serial.println(rmc.speedOverGround); Serial.print("Course OverGround: "); Serial.println(rmc.courseOverGround); Serial.print("Date: "); Serial.println(rmc.date); Serial.print("MagneticVariation: "); Serial.print(rmc.magneticVariation); Serial.print(" "); Serial.println(rmc.magneticVariationDirection); Serial.print("Mode: "); Serial.println(rmc.mode); Serial.println(""); } sprintf(message1, " SOG %f : COG %f : ALT_Meters %f",rmc.speedOverGround ,rmc.courseOverGround ,gga.altitude); // Particle.publish("String2",message1, PRIVATE); previousMillis = millis(); } //----------------------------------------------------------- long duration, distance; digitalWrite(trigPin1, LOW); // Added this line delayMicroseconds(2); // Added this line digitalWrite(trigPin1, HIGH); // delayMicroseconds(1000); - Removed this line delayMicroseconds(10); // Added this line digitalWrite(trigPin1, LOW); duration = pulseIn(echoPin1, HIGH); distance = (duration/2) / 29.1; if (distance < 4) { // This is where the LED On/Off happens digitalWrite(LEDR,HIGH); // When the Redcondition is met, the Green LED should turn off digitalWrite(D2,LOW); } else { digitalWrite(LEDG,LOW); digitalWrite(LEDB,HIGH); } if (distance >= 200 || distance <= 0){ Serial.println("Out ofrange"); } else { Serial.print(distance); Serial.println(" cm"); } delay(500); digitalWrite(trigPin2, LOW); // Added this line delayMicroseconds(2); // Added this line digitalWrite(trigPin2, HIGH); // delayMicroseconds(1000); - Removed this line delayMicroseconds(10); // Added this line digitalWrite(trigPin2, LOW); duration = pulseIn(echoPin2, HIGH); distance = (duration/2) / 29.1; if (distance < 4) { // This is where the LED On/Off happens digitalWrite(LEDR,HIGH); // When the Redcondition is met, the Green LED should turn off digitalWrite(D2,LOW); } else { digitalWrite(LEDG,LOW); digitalWrite(LEDB,HIGH); } if (distance >= 200 || distance <= 0){ Serial.println("Out ofrange"); } else { Serial.print(distance); Serial.println(" cm"); } delay(500); //------------------------------------------------------------- /* } intReset(String command) { if(command =="1") { digitalWrite(D2,HIGH); Particle.publish("D2_On","1",PRIVATE); delay(10000); digitalWrite(D2,LOW); Particle.publish("D2_Reset","0",PRIVATE); } return 1 ; } int Fan(Stringcommand) { if(command=="2") { digitalWrite(D4,HIGH); Particle.publish("D3_On","1",PRIVATE); } else if(command=="3") { digitalWrite(D4,LOW); Particle.publish("D3_Off","1",PRIVATE); } return 1 ; } intRadio(String command) { if(command=="4") { digitalWrite(D3,HIGH); Particle.publish("D4_On","1",PRIVATE); } else if(command=="5") { digitalWrite(D3,LOW); Particle.publish("D4_Reset","0",PRIVATE); */ } int MotorLeft(String command) { if(command =="1") { digitalWrite(D4,HIGH); Particle.publish("Left","1",PRIVATE); } else if(command =="5") { digitalWrite(D4 ,LOW); Particle.publish("off","1",PRIVATE); } return 1 ; } int MotorRight(String command) { if(command =="2") { digitalWrite(D3 ,HIGH); Particle.publish("Right","1",PRIVATE); } else if(command =="5") { digitalWrite(D3,LOW); Particle.publish("off","1",PRIVATE); } return 1 ; } int MotorOn(String command) { if(command =="4") { digitalWrite(D2 ,HIGH); Particle.publish("Motor_On", "1",PRIVATE); } else if(command =="5") { digitalWrite(D2,LOW); Particle.publish("Motor_Off", "0",PRIVATE); } return 1 ; } int MotorBack(String command) { if(command =="3") { digitalWrite(D2 ,HIGH); digitalWrite(D3 ,HIGH); digitalWrite(D4 ,HIGH); Particle.publish("Back", "1",PRIVATE); } else if(command =="5") { digitalWrite(D2,LOW); digitalWrite(D3 ,LOW); digitalWrite(D4 ,LOW); Particle.publish("Motor_Off", "0",PRIVATE); } return 1 ; } 控制器代码(下载最终代码) const int SW_pin = 6; // digital pin connectedto switch output const int X_pin = A1; // analog pinconnected to X output const int Y_pin = A0; // analog pinconnected to Y output const int Up = D5; const int Down = D4; const int Left = D6; const int Right = D3; const int LEDPower = 7; int Switch ; int xaxis ; int yaxis ; void setup() { pinMode(SW_pin, INPUT); digitalWrite(SW_pin, LOW); Serial.begin(9600); pinMode(LEDPower, OUTPUT); digitalWrite(LEDPower, HIGH); pinMode(Down, OUTPUT); pinMode(Left, OUTPUT); pinMode(Right, OUTPUT); pinMode(Up, OUTPUT); } void loop() { Serial.print("Switch: "); Serial.print(digitalRead(SW_pin)); Serial.println("\n"); Serial.print("X-axis: "); Serial.print(analogRead(X_pin)); Serial.println("\n"); Serial.print("Y-axis: "); Serial.println(analogRead(Y_pin)); Serial.print("\n\n"); delay(100); if (analogRead(SW_pin) == 1) { Particle.publish("MotorOn","6"); } if (analogRead(X_pin) == 2128) { Particle.publish("MotorOff","5"); delay(500); } if (analogRead(X_pin) <= 200) { Particle.publish("Left","1"); Particle.publish("MotorOn","6"); } if (analogRead(X_pin) >= 4000) { Particle.publish("Right","2"); Particle.publish("MotorOn","6"); } if (analogRead(Y_pin) == 2128) { Particle.publish("MotorOff","5"); Particle.publish("MotorOn","6"); } if (analogRead(Y_pin) <= 200) { Particle.publish("Back","3"); Particle.publish("MotorOn","6"); } if (analogRead(Y_pin) >= 4000) { Particle.publish("Forward","4"); Particle.publish("MotorOn","6"); } delay(50); } 我正在使用我的Raspberry pi上安装的Node Red作为激活两个粒子之间的中介。调试节点将观察发生的情况并且是可选的。
Pi上的节点红 我制作了一个带有节点红色的仪表板。要遵循的说明
节点RED仪表板
红色节点
下面的字符串拆分代码
字符串拆分代码(用于函数) var OutPutMsgs =[]; var words =msg.payload.split(“:”); for(var w in words){ OutPutMsgs.push({有效载荷:词语[W]}); } return[OutPutMsgs]; 与RaspberryPi集成 我将Remote XY与Node Red结合在一起,在演示中安装了一个Android应用程序......并通过蓝牙与我的Raspberry Pi连接。 什么是人工智能? 人工智能(AI)是数字计算机或计算机控制的机器人执行通常与智能生物相关的任务的能力。
与Adacore合作 |
微信公众号
手机版