你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

使用Adacore和Particle攻击iRobot充当RC

[复制链接]
点点&木木 发布时间:2018-12-24 18:31
我的机器人被雨淋湿了,它被烧焦了。我用粒子,STM32开发板和Adacore破解了它。
18-1.jpeg
在这个项目中使用的东西
硬件组件        
粒子光子  ×1     
我是机器人  ×1         
STM32-H407  ×1        
Raspberry Pi 3型号B.     ×  1               
粒子电子  ×1     
软件应用程序和在线服务
粒子构建Web IDE           
Android Studio
Qualicom数学库
远程XY
手动工具和制造机器
烙铁(通用)         
** *******注意************
这是迄今为止我尝试过的最雄心勃勃的项目。
18-2.jpg
基本数据和控制流程
当我发现我的iRobot因雨而受损时,我打开它并清理掉它的腐蚀,并设法修复了电路板的充电部分,然后完好无损。
我测量了电机,发现驱动电机的正负部分在哪里。然后我将电线焊接到接线柱和电池的正极和负极上。
前往绘图板并设计一个安装在iRobot Body顶部的护罩。粒子由iRobot供电,因此功率不是问题。主要问题是设计一个正向和反向屏蔽,因为(负面和正面)需要反转,使电机向后移动,这也是机器转向的方式。附上设计原理图。
该项目将分多步进行
1. iRobot电机控制与编程
a.板的设计和焊接
b.粒子规划和结点红
2. 用AdaCore编程实现自动化控制
a.机器学习与粒子集成
b.使用Adacore进行机器学习编程
c。程序运行
3.视频
现在的项目
18-3.jpeg
iRobot胆线焊接电线
18-4.jpeg
1轮控制电路基本原理图
要反转直流电机方向,您需要同时反转电机的负极和正极。并且在进行连接之前需要先断开以防止短路和大火花。
如上图所示,不需要D1和D3,因为激活电路与控制电路分开,NPN晶体管将接触器与控制器隔离。
1A。电路板设计和焊接
我正在使用2个继电器,每个继电器用于驱动每个车轮的正向反向(我的继电器只有单个NO和NC带有公共端),另一个继电器作为激活继电器,它将驱动刷子并启动电机。电路中的二极管和电容器可防止电机中电刷的火花和短路。
中继板
18-5.jpg
完成的板
18-6.jpg
板顶无铜线层可以看到布线
为了最终确定电路板,我添加了一个+ 5VDC USB输出,为操纵杆板上的Electron电池充电。
我正在使用粒子文档中有关发布和订阅以及传感器板上的粒子功能的示例。
这是PCBway.com 的原始板
18-7.jpeg
来自PCBway.com 的原始板
这是成品板。
焊接和测试主板
18-8.1.jpeg
18-8.2.jpeg
18-8.3.jpeg
18-8.4.jpeg
18-8.5.jpeg
18-8.6.jpeg
18-9.1.jpeg
18-9.2.jpeg
18-9.3.jpeg

18-9.4.jpeg
18-9.5.jpeg
18-10.1.jpeg
18-10.2.jpeg
18-10.3.jpeg
18-10.4.jpeg
18-10.5.jpeg
遥控器如下。我设计遥控器使用另一个粒子和操纵杆,但iPhone或iPad也可以使用应用程序。(可能会跟随)。
18-11.jpeg
iRobot使用不同的板来测试继电器
传感器板

18-12.jpg
前传感器板
这是来自pcbway.com 的原始板
18-13.jpeg
我添加了一个跳线引脚装置,已说明RGB LED的类型
这是完成的板
18-14.1.jpeg
没有超声波传感器
18-14.2.jpeg
使用超声波传感器
18-14.3.jpeg
18-14.4.jpeg
这是完成的控制线路。
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作为激活两个粒子之间的中介。调试节点将观察发生的情况并且是可选的。
18-15.jpg
Pi上的节点红
我制作了一个带有节点红色的仪表板。要遵循的说明
18-16.jpeg
节点RED仪表板
18-17.1.jpeg
红色节点
18-17.2.jpeg
下面的字符串拆分代码
18-17.3.jpeg
字符串拆分代码(用于函数)
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)是数字计算机或计算机控制的机器人执行通常与智能生物相关的任务的能力。
18-18.jpeg
与Adacore合作

收藏 评论0 发布时间:2018-12-24 18:31

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版