Kitchen Robotics Part 2或另一个Blynk头像


进入。 歌词,您可以跳过


你好! 在这个故事中,我想继续讨论家用“机器人建筑”这一主题,这是上一篇文章的延续

我会立即警告您:我不是这个行业的专家,我只是在学习,而且很长一段时间以来我一直“尴尬”地表达自己的想法并在这里布置自制的东西。 我已经阅读了很长时间的有关Habr的出版物,有时您会想知道世界上正在发生什么! 您阅读了一篇文章,却不知道作者从哪里知道! 您怎么能解决这个问题! 有鉴于此,我认为我的“笨拙”演讲对任何人都不会很有趣,但是有超过9000人观看了上一个故事,对我来说这当然是成功的,我认为像我这样的很多人都是“普通人”,没有获得麻省理工学院的文凭,因此他们更容易访问此信息。 所以走吧...

结构变更


作为我项目的基础,我采用了之前的“创意”,一个打扮得很轻巧的chupocabra,进行了一次假期。 我这样做是为了有一天,而且是通过即兴的手段(可以从外观上追溯到即兴创作)来进行的。 它看起来像这样:


首先,我清除了所有不必要的东西,购买了铝型材并为新设计打了孔。

我真的很喜欢外国公司“ Origibot”的网真机器人的性能

图片

图片

它的苦行者外观有几个优点,请自己判断,重量不大,这主要是节省功率,人机工程学,节省电池电量,动力更弱的驱动器。 想象一下这样的情况,假设我们继续前进,当时的通讯出现问题,如果机器人的重量只有几十公斤,后果可能是致命的。 我认为这种形式的第二个优点是可以将机械手折叠在轮子之间,可以将某些东西抬离地面。

哦,很好,启发了! 为了重现“他的”,他决定将生产分成几个阶段:

  1. 基于两个驱动轮和一个支撑后轮的轴距制造。
  2. 为管理写草图。
  3. 安装相机或手机。 摆放的高度是根据厨房炉灶的高度选择的,因此您可以观察平底锅,看看罗宋汤是用什么做的。
  4. 在摄像机上安装一个伺服器,以便您可以在“腿”和天花板下面看。 我没有理会水平运动,可以转动底座。
  5. 带手柄将其安装在机械手的“产品”上。

接下来,关于机器人的一般概念,在尚未实现的理想版本中进行调试,主要电信设备应为电话。 Skype安装在其上,配置为自动接收视频呼叫,并且电话也将成为基于ESP模块的板卡的访问点,这将使控制机械手和视频会议成为可能。 为什么要使用Skype 如果您已经拥有可以完美运行并且可以根据网络带宽自动更改质量的服务,为什么要提出一些建议。

第一件产品没有问题,底座可以使用以前的工艺准备好,除去所有多余的东西,即带有自制远程天线的TPlink MR3020路由器。 在上一个演讲中,有“厚”墙,我不得不集体农场,结果是+ 9db。 流量控制命令传到路由器上,即cyberWRT固件。

第二点更有趣,我在arduino编程“ LED Blinker”上学习过,在互联网上找到了现成的草图,不幸的是我不记得作者,我并没有使用科学的戳方法为自己做太多事情,那些不了解该理论的人会使用它。 由于对我来说,即使使用底层语言进行编程也是一片漆黑的森林,因此我不得不选择一个可以在其上构建自己的控制面板的平台。 对我而言,一个重要方面是能够通过云服务控制机器人的能力,因为控制将来自“灰色地址”。 Blynk服务已经成为这样的平台,我不会描述其优势,网络上有很多信息。 在第一个版本中,我使用操纵杆小部件来控制运动,代码如下所示:

#define BLYNK_PRINT Serial #include <ESP8266_Lib.h> #include <BlynkSimpleShieldEsp8266.h> #include <AccelStepper.h> #include <Servo.h> #include <SimpleTimer.h> // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "****"; // Your WiFi credentials. // Set password to "" for open networks. char ssid[] = "****"; char pass[] = "****"; #define EspSerial Serial3 #define ESP8266_BAUD 115200 ESP8266 wifi(&EspSerial); BlynkTimer timer; Servo servo; Servo servo2; // These are used to set the direction of the bridge driver. #define ENB 5 //ENB      monstr motor shield  5  6     #define MOTORB_1 4 //IN3 #define MOTORB_2 9 //IN4 #define MOTORA_1 8 //IN1 #define MOTORA_2 7 //IN2 #define ENA 6 //ENA int motor_right_speed = 0; int motor_left_speed = 0; AccelStepper Stepper1(4, 10, 11, 12, 13); //4  ,      int steeps = 192; //  ,    ,    // SETUP void setup() { Serial.begin(9600); delay(10); EspSerial.begin(ESP8266_BAUD); delay(10); // Connect Blynk Blynk.begin(auth, wifi, ssid, pass); Blynk.connect(); // Configure pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); digitalWrite(ENA,LOW); digitalWrite(ENB,LOW); Stepper1.setMaxSpeed(10000); //      (/) Stepper1.setAcceleration(10000); //  (/^2) servo.attach(1); servo2.attach(3); servo2.write(55); timer.setInterval(500L, StopServo); // Start serial communication } BLYNK_WRITE(V1) /     ,  , / { if (param.asInt() == 1) { servo.attach(1); servo.write(165); // High gear timer.setTimeout(500L, StopServo); } else { servo.attach(1); servo.write(115); // Low gear timer.setTimeout(500L, StopServo); } } BLYNK_WRITE(V2) { servo2.write(param.asInt()); } void StopServo() /  { servo.detach(); } // JOYSTICK BLYNK_WRITE(V0) { int nJoyY = param[0].asInt(); // read x-joystick int nJoyX = param[1].asInt(); // read y-joystick // OUTPUTS int nMotMixL; // Motor (left) mixed output int nMotMixR; // Motor (right) mixed output // CONFIG // - fPivYLimt : The threshold at which the pivot action starts // This threshold is measured in units on the Y-axis // away from the X-axis (Y=0). A greater value will assign // more of the joystick's range to pivot actions. // Allowable range: (0..+127) float fPivYLimit = 1023.0; // TEMP VARIABLES float nMotPremixL; // Motor (left) premixed output float nMotPremixR; // Motor (right) premixed output int nPivSpeed; // Pivot Speed float fPivScale; // Balance scale between drive and pivot // Calculate Drive Turn output due to Joystick X input if (nJoyY >= 0) { // Forward nMotPremixL = (nJoyX>=0)? 1023.0 : (1023.0 + nJoyX); nMotPremixR = (nJoyX>=0)? (1023.0 - nJoyX) : 1023.0; } else { // Reverse nMotPremixL = (nJoyX>=0)? (1023.0 - nJoyX) : 1023.0; nMotPremixR = (nJoyX>=0)? 1023.0 : (1023.0 + nJoyX); } // Scale Drive output due to Joystick Y input (throttle) nMotPremixL = nMotPremixL * nJoyY/900.0; //      nMotPremixR = nMotPremixR * nJoyY/1023.0; // Now calculate pivot amount // - Strength of pivot (nPivSpeed) based on Joystick X input // - Blending of pivot vs drive (fPivScale) based on Joystick Y input nPivSpeed = nJoyX; fPivScale = (abs(nJoyY)>fPivYLimit)? 0.0 : (1.0 - abs(nJoyY)/fPivYLimit); // Calculate final mix of Drive and Pivot nMotMixL = (1.0-fPivScale)*nMotPremixL + fPivScale*( nPivSpeed); nMotMixR = (1.0-fPivScale)*nMotPremixR + fPivScale*(-nPivSpeed)/ 1.1; motor_left_speed = nMotMixL; motor_right_speed = nMotMixR; if (motor_right_speed > 20) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); } else if (motor_right_speed < -20) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2, HIGH); } else { digitalWrite(MOTORA_1, LOW); digitalWrite(MOTORA_2, LOW); } if (motor_left_speed > 20) { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, HIGH); } else if (motor_left_speed < -20) { digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else { digitalWrite(MOTORB_1, LOW); digitalWrite(MOTORB_2, LOW); } analogWrite(ENB, abs(motor_left_speed)); analogWrite(ENA, abs(motor_right_speed)); } BLYNK_WRITE(V3) { // Motor Speed - Slider set with 0-100 and Send On Relese OFF int pinValue = param.asInt(); Stepper1.move(pinValue); } // MAIN CODE void loop() { Blynk.run(); timer.run(); Stepper1.run(); } 


接下来,安装摄像头或手机,我尝试了两者。

图片

在照片中,机械手分开站立。

现在该进行测试了! 我借此机会分割了手机的屏幕(在最新的android固件中可用),视频的上部,底部控件。 为了同时启动所有程序,我从Play Market下载了Screens应用程序并开始...


在第一个“ pokatushek”期间,发现了以下缺点:在德国人的过去,该发动机过去曾用某种吸引力旋转某些东西,但由于直线作用而产生不同的输出,因此该机芯不起作用。 它一直在向一个方向移动,一直在调整以计算代码中的引擎速度,它有所帮助,但是决定将代码重做为按钮,对我来说更方便,并且公寓中的移动大部分是线性的。

事实证明,这之后是最耗时的阶段,现在很清楚,为什么市场上的许多网真机器人都没有机械手。 不久前,我深入研究了这个问题,我读到了关于计算沿负载轴未平均分配的旋转驱动器的方法,我记得我十五年前坐在研究所参加的一次理论力学讲座时,我突然想到:``为什么我需要一个未来的工程师-电工-这个废话。” 好吧,正如他们所说:“没有理论的实践是盲目的。” 我重做机械手大约十次,烧了几个伺服器,这些伺服器原本应该用来举起主要负载。

如果您关注Origibot的照片,那么那里的驱动器很糟糕,在他们的网站上我读到该机械手可以举起1公斤的重量,太棒了!
例如,如果我们以20 kg / cm的力应用伺服驱动器,则在2 cm的距离处可以增加10 kg的负载,并且如果该负载的重量沿轴分布不均,并且轴的长度大约为一米,则重量甚至更少。

很好,那是旧的闭路电视摄像机,我从中取出了两个步进电机,太好了! 一台引擎将提升轴,第二台引擎将自动窗帘。 我长期以来一直想在家中生活,但同时又想出了如何与继蠕虫一起工作! 可以这么说,两只鸟一次一块石头。 是的 主要的“麻烦”是在等待,我忘了说我使用Wemos D1 R1控制器制作的自制产品,它看起来与Arduino Uno相似,只有板载wifi。 虽然没有机械手,但板上有足够的引脚,增加了一个步进电机,以控制绕组,您需要四个引脚,在哪里可以买到呢? 事实证明,电路板的引脚是CES本身的引脚,提供通信,从0号到8号的引脚被进一步重复。 好吧,正如他们说的那样:“脑袋不好使您的手无法安宁!”
错误的代价-将工作结果转移到Wemos 2560 esp8266开发板,该开发板是常规的Mega和Esp。 我将其用于温室自动化,当然它不是马上就可以完成的,草图无法编译,错误也可以解决。 在网站上找到了一个解决方案:
community.alexgyver.ru/threads/robotdyn-mega-wifi-r3-connect-blynk.1270/#post-16746
以下是按钮操作的Mega的草图:

 #define BLYNK_PRINT Serial #include <ESP8266_Lib.h> #include <BlynkSimpleShieldEsp8266.h> #include <AccelStepper.h> #include <Servo.h> #include <SimpleTimer.h> #define EspSerial Serial3 #define ESP8266_BAUD 115200 ESP8266 wifi(&EspSerial); #define ENB 5 //ENB      monstr motor shield  5  6     #define MOTORB_1 4 //IN3 #define MOTORB_2 9 //IN4 #define MOTORA_1 8 //IN1 #define MOTORA_2 7 //IN2 #define ENA 6 //ENA BlynkTimer timer; Servo servo; Servo servo2; AccelStepper Stepper1(4, 10, 11, 12, 13); //4  ,      char auth[] = "****"; char ssid[] = "****"; char pass[] = "****"; // SETUP void setup() { Serial.begin(9600); delay(10); EspSerial.begin(ESP8266_BAUD); delay(10); // Connect Blynk Blynk.begin(auth, wifi, ssid, pass); Blynk.connect(); // Configure pins pinMode(ENA, OUTPUT); pinMode(MOTORA_1, OUTPUT); pinMode(MOTORA_2, OUTPUT); pinMode(ENB, OUTPUT); pinMode(MOTORB_1, OUTPUT); pinMode(MOTORB_2, OUTPUT); Stepper1.setMaxSpeed(100); //      (/) Stepper1.setAcceleration(96); //  (/^2) servo.attach(2); //   servo.write(115); //    servo2.attach(3); //  servo2.write(55); //    //timer.setInterval(500L, StopServo); // Start serial communication } BLYNK_WRITE(V6) { servo.write(param.asInt()); //timer.setTimeout(2500L, StopServo); } BLYNK_WRITE(V7) { servo2.write(param.asInt()); } //void StopServo() { // servo.detach(); //} BLYNK_WRITE(V8) { int pinValue = param.asInt(); Stepper1.move(pinValue); } BLYNK_WRITE(V4) { int speedL = param.asInt(); //      . 1,13       analogWrite(ENA, speedL); analogWrite(ENB, speedL* 1.13); } / FORWARD BLYNK_WRITE(V0) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // RIGHT BLYNK_WRITE(V1) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,HIGH); digitalWrite(MOTORB_2,LOW); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // LEFT BLYNK_WRITE(V2) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,HIGH); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // BACKWARD BLYNK_WRITE(V3) { int button = param.asInt(); // read button if (button == 1) { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,HIGH); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,HIGH); } else { digitalWrite(MOTORA_1,LOW); digitalWrite(MOTORA_2,LOW); digitalWrite(MOTORB_1,LOW); digitalWrite(MOTORB_2,LOW); } } // MAIN CODE void loop() { Blynk.run(); timer.run(); Stepper1.run(); 


结果,中文名词的功率甚至更低-5kg / cm,我决定尝试通过皮带:

图片

尽管张紧器安装在辊上,皮带仍打滑(未显示)。 由一系列技术挫折引起的异常精神病和神经质被一个新想法打断了。 有必要减轻结构的重量-放弃轴末端的两个伺服器,以获得更大的自由度并减少机械手轴的长度。 (我希望保险丝会保留下来,这个决定是暂时的)。

图片

同样在照片上,我安装了一个外部扬声器,该扬声器由制造商Hikvizhn焊接到ds-2cd2432f-iw相机上。 专职发言人似乎很虚弱。

现在的外观如下。

图片

总结


我们有一个带轮照相机,为什么到目前为止我拒绝了电话。 当将视频图像控制为最小到一个小窗口的大小时,Skype在手机的多窗口模式下无法正常工作,这在机器人移动时不太方便。 因此,在停下相机时,我仍然使用“ Tiny cam pro”程序的付费版本来访问视频,从世界任何地方访问,将相机无线连接到路由器,并在路由器上转发其端口并使用No-Ip域名服务。 到目前为止,提供商最好提供一个“白色”地址。 您问为什么我不使用Blynk进行视频传输,因为有一个标准的小部件可以传输rtsp协议。 我回答,我想使用相机的全部功能,即双向通讯。 即使采用应用程序提供的形式,其中使用音频编解码器也会大大降低声音质量。 Blynk应用程序中最重要的rtsp协议会稍有延迟,这对于使用重10公斤的机制行驶至关重要。

营养,一个有趣的话题。 自主充电站的问题尚未解决; 在以前的型号上,我使用了成对并联焊接的锂离子电池,通过充电控制器将电压提高到12V,并增加了容量。 在这个项目中,他拒绝锂电池,因为糟糕的经历,电池爆炸了! 铅酸电池7A / h安装在单元的后部,为了在机械手举起负载时进行均匀的负载分配,将一个直流转换器连接到电池上,从而将电压降低5V,从而为控制器和两个MonstrmotorShield引擎驱动器的逻辑供电,每个车轮一个,因为只有驾驶员的地板在两个板中都起作用了,很可能是工厂婚姻,不能给个想法,好吧,没有丢掉它吗?.. ln298电动机驱动器需要两个步进电动机来工作。

在尚未解决的问题中,自动充电,我想像这样重复



我也不太了解AccelStepper库,如果您为电机绕组供电,则在机械手完成之后,电源仍然存在,这会使电池放电电流增加约400mA,这不经济,当机械手处于较低位置时,您需要提出逻辑,关闭绕组的电源。 我也希望获得反馈,以便在打开机器人电源时将舵机和步进蠕虫的位置移到Blynk。 当然,当电压降至10.5V时,电池必须断开负载,以防止电池过早老化。 无法通过计算机进行控制。 当然,代码需要优化。

那些不怕多书并读到最后的人,谢谢大家,祝大家好运!
最后,我们会做一点!

Source: https://habr.com/ru/post/zh-CN477490/


All Articles