伟德国际备用网址后院大脑标志

神经科学为每个人!

+1 (855) get-spikes


项(

实验:控制爪子

制作您的第一个拟人神经调节剂,在其中控制机器人爪与肌肉的信号。

时间2小时
困难先进的

你会学到什么?

在以下实验中,您将学习用肌肉的EMG信号控制爪。爪将根据您在收缩手的肌肉时所做的信号的强度打开和关闭;您可以履行此实验,以为您的朋友留下深刻的印象,以便学校科学公平,或只是潜入神经调节学的研究!

先决条件的实验室

设备


背景

基于由墨西哥瓦哈卡的电子工程师学生joséantegópezpérez的原型。

伺服电动机

使机器人经常使用伺服电机。它们普遍称为“伺服”,可用于小尺寸,低功耗和高精度。它们可以在玩具汽车的转向控制中或船舶或飞机的舵中找到,例如...伺服电机由小型直流电机组成,齿轮传动装置降低速度并增加强度,并且一个小型电路控制,使得可以精确地移动电机。

步进电机和伺服电机之间有什么区别?

在A内步进电机有线圈,有必要向它们施加一系列脉冲,为电机旋转一定数量的步骤;这就是为什么它有这么多电线出来(通常是5到6个电线)。然而,在伺服电机内部有一个直流电动机和电路控制器,电路控制器可以仅使用三根电线进行精确定位,用于控制,另一个用于电源和地。

伺服电机和步进电机之间的一些重要区别是:速度,强度和精度;伺服电机可以以比步进电机更大的速度移动,并具有更多的力量和精度。步进电机通常不用于高速应用,因为在这些速度下它会失去强度。然而,在低速时,步进电机比伺服更准确和更强,这就是为什么它被广泛应用于工业机器人手臂。

PWM(脉冲宽度调制)是伺服控制最常用的系统。该系统产生一个方波,其改变脉冲高的时间量,保持相同的时间;信号的高电平持续时间表示我们想要放置电机轴的位置。控制电路中的集成电位器监视伺服的电流角:如果轴处于直角,则电机关闭。电路检查如果角度不正确,伺服将纠正方向,直到角度为正确。通常,伺服的轴能够达到约180度,但在一些伺服达到210度(您甚至可以找到360×1的电机,这些伺服结构是您需要广角旋转的安装,但是该范围因应用和制造商而异。脉冲持续时间表示电动机的旋转角度。

重要的是要强调,要使伺服保持在相同位置,必须连续发送恒定宽度的脉冲。这样,如果有一种试图改变这个位置的力,电机将尝试抵抗。如果伺服电机停止发送脉冲,或者脉冲之间的间隔大于允许的最大值,则伺服电机失去强度并停止试图保持其位置,并且任何外力就能移动它。

伺服控制。伺服电动机传统上有三根电线:电源,地和信号。电源线通常是红色的,并且在这种配置中连接到5V。地线通常是黑色或棕色,必须连接到....地面。信号电缆通常是白色的,黄色或橙色,需要连接到PWM(脉冲宽度调制)信号。为了生成PWM波形,通常使用微控制器,因为它具有特定的硬件来执行此任务并促进生成信号的过程。它可以用几行代码来完成这件事。

终端配置

在该实验中,您将仅使用尖峰灯面的电源,地面和数字输出销2来产生PWM波。电源将来自第二个9V电池(如果使用Arduino自己的电源为电机供电,由于伺服电压绘制,肌肉活动的放大变得不稳定)。

下载

取我们的(.ino)爪草图,并将其加载到Arduino上

视频

程序

  1. 你的机器人爪有一根三线伺服电机电缆,你可以把它插入你的肌肉刺盾。电缆有一根黑色、红色和黄色的线。黄色为控制线,红色为电源(9V),黑色为接地线。
  2. 将伺服电机电缆插入肌肉尖顶灯面上的三个引脚标头。订单很重要!黄色侧朝向板的中心。
  3. 你的利爪渴望能量,需要自己的能量供给。将两节9V电池插入Muscle SpikerShield板和Arduino上的桶形连接器。
  4. 将三个电极贴在自己身上,两个贴在前臂上,一个贴在手背上。
  5. 拍摄橙色电极电缆,将前臂上的电极上的两个红色鳄鱼夹连接(订单无关紧要)和地面上的地面上的黑色鳄鱼夹。将橙色电缆插入肌肉尖顶灯面上的橙色端口。
  6. 将额外的电池插入蓝色Arduino板上的桶状连接器,为系统供电。
  7. 现在弯曲你的手臂!你也应该看到Claw的移动。按下白色按钮可以在高阈值和低阈值模式之间切换,按下红色按钮可以在默认打开和默认关闭之间切换。

    代码说明:此代码与肌肉尖峰灯的帮助,arduino求助,捕获通过剪切前臂的肌肉产生的EMG信号,并将它们转换为PWM脉冲,以使移动到伺服电机。这些脉冲根据肌肉的运动而改变:抓住手的力量越多,爪子越近。使用 库包括在这个程序,你可以很容易地控制伺服电机,没有太多的代码。下面您可以看到代码,但如果您想下载它,只需点击这里或者在上面的链接中。

    的代码

    / * * --------------------------------------------------------------------------- *代码监控EMG信封的幅度,显示EMG强度在LED杆上并通过控制伺服电机控制*机器人夹具。* ----------------------------------------------------------------------------- * / #include&ltservo.h> #define gripper_state_button_pin 4 //引脚按钮切换夹具的猝灭状态//(打开/关闭)#define servo_pin 2 // pin for伺服电机#define sensitivity_button_pin 7 // pin for按钮,用于选择sesitivity #define num_led 6 // LED数量LED栏#define gripper_minimum_step 5 // 5度死区(用于避免//瞄准振幻)#define open_mode 1 //默认夹持器状态打开#define close_mode 2 //默认夹持状态是关闭#define minipt_servo_update_time 100 //更新每100ms伺服夹具伺服位置;//抓握抓握字节LEDPINS [] = {8,9,10,11,12,13};// LED为LED栏// EMG饱和度值的引脚(当EMG达到此值//夹具时,将完全打开/关闭)int Sensitivity [] = {200,350,520,680,840,1000}; int lastSensitivitiesIndex = 2; //set initial sensitivity index int emgSaturationValue = 0; //selected sensitivity/EMG saturation value int analogReadings; //measured value for EMG byte ledbarHeight = 0; //temporary variable for led bar height unsigned long oldTime = 0; //timestamp of last servo angle update (ms) int oldDegrees = 0; //old value of angle for servo int newDegree; //new value of angle for servo unsigned long debouncerTimer = 0; //timer for button debouncer int gripperStateButtonValue = 0; //variable that stores state of button int userReleasedButton = 1; //flag that is used to avoid multiple //button events when user holds button int currentFunctionality = OPEN_MODE; //current default position of claw //----------------------------------------------------------------------------------- // Setup servo, inputs and outputs // ---------------------------------------------------------------------------------- void setup(){ //init servo Gripper.attach(SERVO_PIN); //init button pins to input pinMode(GRIPPER_STATE_BUTTON_PIN, INPUT); pinMode(SENSITIVITY_BUTTON_PIN, INPUT); //initialize all LED pins to output for(int i = 0; i < NUM_LED; i++){ pinMode(ledPins[i], OUTPUT); } //get current sensitivity emgSaturationValue = sensitivities[lastSensitivitiesIndex]; } //----------------------------------------------------------------------------------- // Main loop // // - Checks state of sesitivity button // - Checks state of default-gripper-state button // - Measure EMG // - Shows EMG strength on LED bar // - Sets angle of servo based on EMG strength and current mode (open/closed) // ---------------------------------------------------------------------------------- void loop() { //----------------------- Switch sensitivity ------------------------------------ //check if button is pressed (HIGH) if (digitalRead(SENSITIVITY_BUTTON_PIN)) { //turn off all the LEDs in LED bar for(int j = 0; j < NUM_LED; j++) { digitalWrite(ledPins[j], LOW); } //increment sensitivity index lastSensitivitiesIndex++; if(lastSensitivitiesIndex==NUM_LED) { lastSensitivitiesIndex = 0; } //get current sensitivity value emgSaturationValue = sensitivities[lastSensitivitiesIndex]; //light up LED at lastSensitivitiesIndex position for visual feedback digitalWrite(ledPins[lastSensitivitiesIndex], HIGH); //wait user to release button while (digitalRead(SENSITIVITY_BUTTON_PIN)) { delay(10); } //whait a bit more so that LED light feedback is always visible delay(100); } //---------------------------- Switch gripper default position open/close --------- //check if enough time has passed for button contact to settle down if((millis() - debouncerTimer) > 50) { gripperStateButtonValue = digitalRead(GRIPPER_STATE_BUTTON_PIN); //if button is pressed if(gripperStateButtonValue == HIGH) { //if last time we checked button was not pressed if(userReleasedButton) { debouncerTimer = millis(); //block button events untill user releases it userReleasedButton = 0; //toggle operation mode if(currentFunctionality == OPEN_MODE) { currentFunctionality = CLOSED_MODE; } else { currentFunctionality = OPEN_MODE; } } } else { userReleasedButton = 1; } } //----------------------------- Measure EMG --------------------------------------- analogReadings = analogRead(A0);//read EMG value from analog input A0 //---------------------- Show EMG strength on LED ---------------------------------- //turn OFF all LEDs on LED bar for(int j = 0; j < NUM_LED; j++) { digitalWrite(ledPins[j], LOW); } //calculate what LEDs should be turned ON on the LED bar analogReadings= constrain(analogReadings, 30, emgSaturationValue); ledbarHeight = map(analogReadings, 30, emgSaturationValue, 0, NUM_LED); //turn ON LEDs on the LED bar for(int k = 0; k < ledbarHeight; k++) { digitalWrite(ledPins[k], HIGH); } //-------------------- Drive Claw according to EMG strength ----------------------- //set new angle if enough time passed if (millis() - oldTime > MINIMUM_SERVO_UPDATE_TIME) { //calculate new angle for servo if(currentFunctionality == OPEN_MODE) { analogReadings = constrain(analogReadings, 40, emgSaturationValue); newDegree = map(analogReadings, 40 ,emgSaturationValue, 190, 105); } else { analogReadings = constrain(analogReadings, 120, emgSaturationValue); newDegree = map(analogReadings, 120 ,emgSaturationValue, 105, 190); } //check if we are in servo dead zone if(abs(newDegree-oldDegrees) > GRIPPER_MINIMUM_STEP) { //set new servo angle Gripper.write(newDegree); } oldTime = millis(); oldDegrees = newDegree; } }

    通过这种新的体验,现在您可以制作自己的发明。告诉我们你正在制作什么info@www.zermakina.com.也许我们可以开始友谊!

    科学公平项目理念

    • 试着设计一些反应时间的实验,可以用你自己的身体和爪子来完成。伟德国际安卓时间有什么不同?这取决于你所反应的感官刺激吗?
    • 把不同竞技水平的人连在一起——这会影响爪子的力量吗?他们能坚持多久呢?
    • 你还可以把它连接到什么设备上?你能连接到的东西或数量的限制是什么?