分类目录归档:Arduino小组

从开源硬件到开源机器人应该怎样上手-教程一

如果说Helllo World是所有编程者牙牙学语的第一课,那么Blink(闪烁)和GoGo(跑起来)应该就是硬件编程和机器人编程的第一课,这就是产品名字的来历。本套入门教程共十篇,基于专为STEM教育(科学、技术、工程、数学)而设计的Blinkgogo车型机器人进行讲解。Blinkgogo mixly 米思奇Arduino 蓝牙小车  ←点击了解Blinkgogo

 

产品拆箱后,我们接下来需要将U盘里的东西拷贝到电脑上,然后打开Mixly或者Arduino进行编程。Mixly(米思齐)是一款基于Arduino的图形化编程软件。用户可以通过拼接积木块的方式来编写程序。按照产品附带的上手手册一即可使用范例程序,并下载完成后,你就可以开始尝试深入了解以便编写自己的程序了。

首先,我们需要先让小车动起来

如果我们想让电机前进,我们该怎么操作呢?

我们先从硬件线路看起,从Blink的底盘部可以看到:

从背面看,motor A为右侧电机,motor B为左侧电机

右侧电机由端口5、10控制

左侧电机由端口6、11控制

端口5、6与电机正向相连接

端口10、11与电机负向相连接

当端口5、6的电压高于端口10、11时,形成上图所示方向电流,左、右电机正转,Blinkgogo前进。反之,左、右电机倒转,Blinkgogo后。,电压相同时,无电流形成,左、右电机停转,Blinkgogo停止

 

那现在,假设我们想让Blink

全速向前前进2秒

再向后后退2秒

最后停止

在编程界面中,我们需要调用

“输入/输出”模块中的”数字输出“模块

和“控制”模块中的”延迟”模块来实现电机的运转

 

向前前进:

使用”数字输出”模块

设置端口5为高电平,端口10为低电平(右电机正转)

使用”数字输出”模块

设置端口6为高电平,端口11为低电平(左电机正转)

使用”延迟”模块

延迟2000毫秒(即持续2秒钟)

向后后退:

使用”数字输出”模块

设置端口5为低电平,端口10为高电平(右电机倒转)

使用”数字输出”模块

设置端口6为低电平,端口11为高电平(左电机倒转)

使用”延迟”模块

延迟2000毫秒(即持续2秒钟)

 

 

停止:

使用”数字输出”模块

设置端口5、6、10、11全为低电平(A、B电机停止)

现在进阶一下

如果我们想让Blink以特定速度前行或后退

我们该怎么做?

即,更改一下之前的任务:

现在我们想让Blink

以60%的速度向前前进2秒

再以60%的速度向后后退2秒

最后停止

 

我们需要调用”输入/输出”模块中的

“模拟输出”模块

来实现电机的调速

设置电机两极中一侧为低电平

一侧为特定的电压值

便可以实现给电机设定速度

电压值的数值设置通过“模拟输出”实现

模拟输出的数值范围为0~255

模拟输出赋值为255即为全速

我们需要60%的速度

则需要将另一端口赋值为60%*255=153。

 

向前前进:

使用”数字输出”模块,设置端口10为低电平

使用”模拟输出”模块,设置端口5为153

(右电机以60%速度正转)

使用”数字输出”模块,设置端口11为低电平

使用”模拟输出”模块,设置端口6为153

(左电机以60%速度正转)

使用”延迟”模块,延迟2000毫秒

(即持续2秒钟)

 

向后后退:

使用”数字输出”模块,设置端口5为低电平

使用”模拟输出”模块,设置端口10为153

(右电机以60%速度倒转)

使用”数字输出”模块,设置端口6为低电平

使用”模拟输出”模块,设置端口11为153

(左电机以60%速度倒转)

使用”延迟”模块,延迟2000毫秒

(即持续2秒钟)

停止:

使用”数字输出”模块

设置端口5、6、10、11全为低电平(A、B电机停止)

最后,我们来讲一下转向

Blink不像我们日常开的汽车有方向盘

可以通过调整转向盘转向

在Blink中,需要用左右电机的速度差来转向

如果右电机速度大于左电机速度,Blink会向左转

左电机速度大于右电机速度,Blink向右转

转弯半径的大小也由速度差的大小决定

要注意,如一侧电机设置为后退

在计算速度差的时候,速度值以负数计算哦

关于Blink转向的探究

就留给大家课后去探索

我们将在下一节,演示不同情景的转向。

附:Arduino源代码

void setup()
{
/*
​
  11      10
   |       |
  |M|     |M|
   |       |
   6       5
​
*/
  pinMode(5, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(11, OUTPUT);
}
​
void loop()
{
  //前进
  //5→10
  digitalWrite(5,HIGH);
  digitalWrite(10,LOW);
   //6→11
  digitalWrite(6,HIGH);
  digitalWrite(11,LOW);
  delay(2000);
​
 //后退
  //10→5
  digitalWrite(5,LOW);
  digitalWrite(10,HIGH);
  //11→6
  digitalWrite(6,LOW);
  digitalWrite(11,HIGH);
  delay(2000);
​
  //停止
  digitalWrite(5,LOW);
  digitalWrite(10,LOW);
  digitalWrite(6,LOW);
  digitalWrite(11,LOW);
  delay(2000);
​
  //前进
  //5→10
  digitalWrite(10,LOW);
  analogWrite(5,153);
     //6→11
  digitalWrite(11,LOW);
  analogWrite(6,153);
  delay(2000);
​
 //后退
  //10→5
  digitalWrite(5,LOW);
  analogWrite(10,153);
  //11→6
  digitalWrite(6,LOW);
  analogWrite(11,153);
  delay(2000);
​
  //停止
  digitalWrite(5,LOW);
  digitalWrite(10,LOW);
  digitalWrite(6,LOW);
  digitalWrite(11,LOW);
  delay(2000);
 
}

 

Blinkgogo机器人套件初上手代码调试

教程一:简单介绍和电机驱动

//电机驱动01
 
/*
 
  11      10
   |       |
  |M|     |M|
   |       |
   6       5
 
*/
void setup()
{
  pinMode(11, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(5, OUTPUT);
}
 
void loop()
{
  // 左前进
  // 6↑ → 11↓
  digitalWrite(6,HIGH);
  digitalWrite(11,LOW);
  //延时1秒
  delay(1000);
  // 左后退
  // 11↑ → 6↓
  digitalWrite(6,LOW);
  digitalWrite(11,HIGH);
  //延时1秒
  delay(1000);
  // 左停止
  // 6↓ = 11↓
  digitalWrite(6,LOW);
  digitalWrite(11,LOW);
  delay(1000);
 
  //右前进
  // 5↑ → 10↓
  digitalWrite(5,HIGH);
  digitalWrite(10,LOW);
  //延时1秒
  delay(1000);
  //右后退
  // 10↑ → 5↓
  digitalWrite(5,LOW);
  digitalWrite(10,HIGH);
  //延时1秒
  delay(1000);
  //右停止
  // 5↓ = 10↓
  digitalWrite(5,LOW);
  digitalWrite(10,LOW);
  //延时1秒
  delay(1000);
}
//电机驱动02
 
/*
 
  11      10
   |       |
  |M|     |M|
   |       |
   6       5
 
*/
void setup()
{
  pinMode(11, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(5, OUTPUT);
}
 
void loop()
{
  //左前进 6↑ → 11↓
  digitalWrite(6,HIGH);
  digitalWrite(11,LOW);
  //右前进 5↑ → 10↓
  digitalWrite(5,HIGH);
  digitalWrite(10,LOW);
  delay(1000);
 
  //左停止
  digitalWrite(6,LOW);
  digitalWrite(11,LOW);
  //右停止
  digitalWrite(5,LOW);
  digitalWrite(10,LOW);
  delay(1000);
 
  //左后退 11↑ → 6↓
  digitalWrite(6,LOW);
  digitalWrite(11,HIGH);
  //右后退 10↑ → 5↓
  digitalWrite(5,LOW);
  digitalWrite(10,HIGH);
  delay(1000);
 
  //左停止
  digitalWrite(6,LOW);
  digitalWrite(11,LOW);
  //右停止
  digitalWrite(5,LOW);
  digitalWrite(10,LOW);
  delay(1000);
 
  //左转(左后退,右前进)
  digitalWrite(6,LOW);
  digitalWrite(11,HIGH);
  digitalWrite(5,HIGH);
  digitalWrite(10,LOW);
  delay(1000);
 
  //左停止
  digitalWrite(6,LOW);
  digitalWrite(11,LOW);
  //右停止
  digitalWrite(5,LOW);
  digitalWrite(10,LOW);
  delay(1000);
 
  //右转(左前进,右后退)
  digitalWrite(6,HIGH);
  digitalWrite(11,LOW);
  digitalWrite(5,LOW);
  digitalWrite(10,HIGH);
  delay(1000);
 
  //左停止
  digitalWrite(6,LOW);
  digitalWrite(11,LOW);
  //右停止
  digitalWrite(5,LOW);
  digitalWrite(10,LOW);
  delay(1000);
}
//电机驱动03
 
int speed = 100;
 
void setup()
{
  pinMode(11, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(5, OUTPUT);
 
  Serial.begin(9600);
}
 
void loop()
{
  Serial.println("Forward");
  //左前进 6↑ → 11↓
  analogWrite(6,speed);
  digitalWrite(11,LOW);
  //右前进 5↑ → 10↓
  analogWrite(5,speed);
  digitalWrite(10,LOW);
  delay(1000);
 
  blinkgogoStop();
 
  Serial.println("Backward");
  //左后退 11↑ → 6↓
  digitalWrite(6,LOW);
  analogWrite(11,speed);
  //右后退 10↑ → 5↓
  digitalWrite(5,LOW);
  analogWrite(10,speed);
  delay(1000);
 
  blinkgogoStop();
 
  //左转(左后退,右前进)
  digitalWrite(6,LOW);
  analogWrite(11,speed);
  analogWrite(5,speed);
  digitalWrite(10,LOW);
  delay(1000);
 
  blinkgogoStop();
 
  //右转(左前进,右后退)
  analogWrite(6,speed);
  digitalWrite(11,LOW);
  digitalWrite(5,LOW);
  analogWrite(10,speed);
  delay(1000);
 
  blinkgogoStop();
  delay(1000);
}
 
 
void blinkgogoStop()
{
  //左停止
  digitalWrite(6,LOW);
  digitalWrite(11,LOW);
  //右停止
  digitalWrite(5,LOW);
  digitalWrite(10,LOW);
}

 

 

教程二:runBlinkgogo封装和走回形

 

//runBlinkgogo封装 测试
 
long speed;
 
/*
 
  11      10
   |       |
  |M|     |M|
   |       |
   6       5
 
*/
 
void runBlinkgogo(long leftSpeed, long rightSpeed)
{
  if (leftSpeed >= 0)
  {
    //6→11
    analogWrite(6,leftSpeed);
    digitalWrite(11,LOW);
  }
  else
  {
    //11→6
    analogWrite(11,0-leftSpeed);
    digitalWrite(6,LOW);
 
  }
  if (rightSpeed >= 0)
  {
    //5→10
    analogWrite(5,rightSpeed);
    digitalWrite(10,LOW);
  }
  else
  {
    //10→5
    analogWrite(10,0-rightSpeed);
    digitalWrite(5,LOW);
  }
}
 
void setup()
{
  speed = 200;
  pinMode(11, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(5, OUTPUT);
}
 
void loop()
{
  //前进
  runBlinkgogo(speed, speed);
  delay(1000);
  //后退
  runBlinkgogo(0 - speed, 0 - speed);
  delay(1000);
  //左转
  runBlinkgogo(0 - speed, speed);
  delay(1000);
  //右转
  runBlinkgogo(speed, 0 - speed);
  delay(1000);
  //停止
  runBlinkgogo(0, 0);
  delay(1000);
}
//
 
long speed;
 
/*
 
  11      10
   |       |
  |M|     |M|
   |       |
   6       5
 
*/
 
void runBlinkgogo(long leftSpeed, long rightSpeed)
{
  if (leftSpeed >= 0)
  {
    //6→11
    analogWrite(6,leftSpeed);
    digitalWrite(11,LOW);
  }
  else
  {
    //11→6
    analogWrite(11,0-leftSpeed);
    digitalWrite(6,LOW);
 
  }
  if (rightSpeed >= 0)
  {
    //5→10
    analogWrite(5,rightSpeed);
    digitalWrite(10,LOW);
  }
  else
  {
    //10→5
    analogWrite(10,0-rightSpeed);
    digitalWrite(5,LOW);
  }
}
 
void setup()
{
  speed = 200;
  pinMode(11, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(5, OUTPUT);
}
 
void loop()
{
  //前进
  runBlinkgogo(speed, speed);
  delay(1000);
 
  //停止
  runBlinkgogo(0, 0);
  delay(300);
 
  //右转
  runBlinkgogo(40, 0 - 40);
  delay(500);
 
  //停止
  runBlinkgogo(0, 0);
  delay(300);
}
//
 
long leftSpeed;
long rightSpeed;
 
/*
 
  11      10
   |       |
  |M|     |M|
   |       |
   6       5
 
*/
 
void runBlinkgogo(long leftSpeed, long rightSpeed)
{
  if (leftSpeed >= 0)
  {
    //6→11
    analogWrite(6, leftSpeed);
    digitalWrite(11, LOW);
  }
  else
  {
    //11→6
    analogWrite(11, 0 - leftSpeed);
    digitalWrite(6, LOW);
 
  }
  if (rightSpeed >= 0)
  {
    //5→10
    analogWrite(5, rightSpeed);
    digitalWrite(10, LOW);
  }
  else
  {
    //10→5
    analogWrite(10, 0 - rightSpeed);
    digitalWrite(5, LOW);
  }
}
 
void setup()
{
  pinMode(11, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(5, OUTPUT);
  Serial.begin(9600);
}
 
void loop()
{
  // 顺时针转圈
  runBlinkgogo(255, 80);
  delay(8000);
  // 逆时针转圈
  runBlinkgogo(80, 255);
  delay(8000);
 
  // 操场式转圈
  runBlinkgogo(255, 100);
  delay(3600);
  runBlinkgogo(255, 255);
  delay(1000);
 
  // 8字型回环
  runBlinkgogo(255, 80);
  delay(4000);
  runBlinkgogo(255, 255);
  delay(1000);
 
  runBlinkgogo(80, 255);
  delay(4000);
  runBlinkgogo(255, 255);
  delay(1000);
 
 
  //蛇形前进(曲率变化)
  for (int speedOffset = -100; speedOffset < 100; speedOffset += 5)
  {
    leftSpeed = 125 + speedOffset;
    rightSpeed = 125 - speedOffset;
    Serial.print(leftSpeed);
    Serial.print("\t");
    Serial.println(rightSpeed);
    runBlinkgogo(leftSpeed, rightSpeed);
    delay(25);
  }
  delay(500); 
  for (int speedOffset = 100; speedOffset > -100; speedOffset -= 5)
  {
    leftSpeed = 125 + speedOffset;
    rightSpeed = 125 - speedOffset;
    Serial.print(leftSpeed);
    Serial.print("\t");
    Serial.println(rightSpeed);
    runBlinkgogo(leftSpeed, rightSpeed);
    delay(25);
  }
  delay(500);
}

教程三:探测黑线传感器使用和blink测试

 

//chapter 03 line_follow01
 
long runSpeed;        //电机基本速度
long sensorValueAll;  //存储左右巡线传感器L2、L3的检测值
byte lastDirection;   //存储上一次转向
 
void setup()
{
  runSpeed = 80;        //电机基本速度
  sensorValueAll = 0;   //存储左右巡线传感器L2、L3的检测值
  lastDirection = 0;    //存储上一次转向
  pinMode(2, INPUT);    //左巡线传感器L2
  pinMode(3, INPUT);    //右巡线传感器L3
  pinMode(11, OUTPUT);  //左马达 Motor B2
  pinMode(6, OUTPUT);   //左马达 Motor B1
  pinMode(10, OUTPUT);  //右马达 Motor A2
  pinMode(5, OUTPUT);   //右马达 Motor A1
}
 
void loop()
{
  //将L2与L3生成一个两位十进制数,存于sensorValueAll用于后续判断偏离方向分类
  sensorValueAll = 10 * digitalRead(2) + digitalRead(3);
  //用switch语句来选择分支机构,共4种情况
  switch (sensorValueAll)
  {
    case 0: //00,左右巡线传感器L2、L3都检测到黑线
      runBlinkgogo(runSpeed, runSpeed); //继续左右同速直线前行
      break;
    case 1: //01,左巡线传感器L2检测到黑线,右巡线传感器L3检测到离开黑线
      runBlinkgogo(runSpeed, 100);  //Motor B &lt; Motor A,左转 lastDirection = 0; //存储本次转向,零为右转 break; case 10: //10,左巡线传感器L2检测到离开黑线,右巡线传感器L3检测到黑线 runBlinkgogo(100, runSpeed); //Motor B &gt; Motor A,右转
      lastDirection = 1;  //存储本次转向,零为左转
      break;
    case 11:  //11,左右巡线传感器L2、L3都检测到离开黑线
      if (lastDirection)  //依照上次转向,单轮速度为零,加大转向速度
      {
        runBlinkgogo(runSpeed, 0);  //依照上次转向,右电机不动,左电机前进,右轮为中心右转
      }
      else
      {
        runBlinkgogo(0, runSpeed);  //依照上次转向,左电机不动,右电机前进,左轮为中心左转
      }
      break;
    default:  //其它情况
      runBlinkgogo(0, 0); //停机
      break;
  }
}
 
//传入左右电机运动参数,参数有效范围-256至于+255,
//但近0附近数值因摩擦阻力等存在死区,约-40至+40,导致电机无法转动
void runBlinkgogo(long leftSpeed, long rightSpeed)
{
  if (leftSpeed &gt;= 0)
  {
    //6→11
    analogWrite(6, leftSpeed);
    digitalWrite(11, LOW);
  }
  else
  {
    //11→6
    analogWrite(11, 0 - leftSpeed);
    digitalWrite(6, LOW);
 
  }
  if (rightSpeed &gt;= 0)
  {
    //5→10
    analogWrite(5, rightSpeed);
    digitalWrite(10, LOW);
  }
  else
  {
    //10→5
    analogWrite(10, 0 - rightSpeed);
    digitalWrite(5, LOW);
  }
}
//chapter 03 line_follow02
 
long speedBase = 100;   //电机基本速度
long speedOffset = 40;  //电机偏置速度
long speedLeft = 100;   //左电机速度参数传入值
long speedRight = 100;  //右电机速度参数传入值
boolean lastDirectionLeft = true; //上一次偏转方向是否为的右布尔值
 
 
void setup()
{
  pinMode(13, OUTPUT);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
}
 
void loop()
{
  //根据左右巡线传感器L2、L3是否压线亮灯
  detectBlink();
  if(onLine(2)&amp;&amp;onLine(3))  //左右巡线传感器L2、L3都检测到黑线
  {
    runBlinkgogo(speedBase,speedBase);  //继续左右同速直线前行
  }
  if(!onLine(2)&amp;&amp;!onLine(3)) //左右巡线传感器L2、L3都检测到离开黑线 
  {
    if (lastDirectionLeft)
      runBlinkgogo(0, speedRight+speedOffset); //Motor B &lt; Motor A,左转 else runBlinkgogo(speedLeft+speedOffset, 0); //Motor B &gt; Motor A,右转
  }
  if(onLine(2)&amp;&amp;!onLine(3)) //左巡线传感器L2检测到黑线,右巡线传感器L3检测到离开黑线
  {
    runBlinkgogo(speedLeft-speedOffset, speedRight+speedOffset);
    lastDirectionLeft = true; //存储本次转向,零为右转
  }
  if(!onLine(2)&amp;&amp;onLine(3)) //左巡线传感器L2检测到离开黑线,右巡线传感器L3检测到黑线
  {
    runBlinkgogo(speedLeft+speedOffset, speedRight-speedOffset);
    lastDirectionLeft = false;  //存储本次转向,零为左转
  }
}
 
//检测Ln是否压黑线
boolean onLine(int Ln)
{
  return !digitalRead(Ln);
}
 
//检测到左右巡线传感器L2、L3都压黑线则关LED灯
//其中一个离开则亮全车LED灯提醒
void detectBlink()
{
  if(onLine(2) &amp;&amp; onLine(3))
    digitalWrite(13,LOW);
  else
    digitalWrite(13,HIGH);
}
 
//传入左右电机运动参数,参数有效范围-256至于+255,
//但近0附近数值因摩擦阻力等存在死区,约-40至+40,导致电机无法转动
void runBlinkgogo(long leftSpeed, long rightSpeed)
{
  if (leftSpeed &gt;= 0)
  {
    //6→11
    analogWrite(6,leftSpeed);
    digitalWrite(11,LOW);
  }
  else
  {
    //11→6
    analogWrite(11,0-leftSpeed);
    digitalWrite(6,LOW);
 
  }
  if (rightSpeed &gt;= 0)
  {
    //5→10
    analogWrite(5,rightSpeed);
    digitalWrite(10,LOW);
  }
  else
  {
    //10→5
    analogWrite(10,0-rightSpeed);
    digitalWrite(5,LOW);
  }
}
//chapter 03 line_follow03
 
#define L1 4  //左上角巡线传感器L1
#define L2 2  //左巡线传感器L2
#define L3 3  //右巡线传感器L3
#define L4 7  //右上角巡线传感器L4
 
long noLineTimes = 0;     //存储所有巡线传感器没检测到黑线的次数
long speedBase = 100;     //电机基本速度
long speedLeft;           //左电机速度参数传入值
long speedRight;          //右电机速度参数传入值
long speedOffset = 40;    //电机偏置速度
boolean lastDirectionLeft;//上一次偏转方向是否为右的布尔值
 
void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);    //全车LED
  pinMode(L1, INPUT);     //左上角巡线传感器L1
  pinMode(L2, INPUT);     //左巡线传感器L2
  pinMode(L3, INPUT);     //右巡线传感器L3
  pinMode(L4, INPUT);     //右上角巡线传感器L4
  speedLeft = speedBase;  //左电机速度参数传入值
  speedRight = speedBase; //右电机速度参数传入值
}
 
void loop()
{
  detectBlink();  //根据左右巡线传感器L2、L3是否压线亮灯
  //全部巡线传感器检测或检测不到黑线
  if ((onLine(L1) &amp;&amp; onLine(L2) &amp;&amp; onLine(L3) &amp;&amp; onLine(L4)) == true || (onLine(L1) || onLine(L2) || onLine(L3) || onLine(L4)) == false)
  {
    noLineTimes ++; //存储所有巡线传感器没检测到黑线的次数加一
    Serial.print("noLineTimes++");
    Serial.println(noLineTimes);
  }
  else
  {
    //L1压黑线
    if (onLine(L1))//L1 is connect to PIN D4
    {
      //只有L1压黑线
      if (!onLine(L2) &amp;&amp; !onLine(L3) &amp;&amp; !onLine(L4))
      {
        speedLeft = -speedOffset;
        speedRight = speedOffset;
        lastDirectionLeft = true;
      }
    }
    //L4黑线
    else if (onLine(L4))//L4 is connect to PIN D7
    {
      //只有L4压黑线
      if (!onLine(L1) &amp;&amp; !onLine(L2) &amp;&amp; !onLine(L3))
      {
        speedLeft = speedOffset;
        speedRight = -speedOffset;
        lastDirectionLeft = false;
      }
    }
    else
    {
      //左右巡线传感器L2、L3都检测到黑线
      if (onLine(L2) &amp;&amp; onLine(L3))
      {
        speedLeft = speedBase;
        speedRight = speedBase;
      }
      //L2压黑线、L3不压黑线
      if (onLine(L2) &amp;&amp; !onLine(L3))
      {
        speedLeft = speedBase;
        speedRight = speedBase + speedOffset;
        lastDirectionLeft = true;
      }
      //L2不压黑线、L3压黑线
      if (!onLine(L2) &amp;&amp; onLine(L3))
      {
        speedLeft = speedBase + speedOffset;
        speedRight = speedBase;
        lastDirectionLeft = false;
      }
      //L2与L3都不压黑线
      if (!onLine(L2) &amp;&amp; !onLine(L3))
      {
        //上一次转向为左
        if (lastDirectionLeft)
        {
          speedLeft = 0;
          speedRight = speedBase + speedOffset;
        }
        //上一次转向为右
        else
        {
          speedLeft = speedBase + speedOffset;
          speedRight = 0;
        }
      }
    }
    noLineTimes = 0;
  }
  //存储所有巡线传感器没检测到黑线的次数,是否传入电机参数运行
  if (noLineTimes &lt; 50) { runBlinkgogo(speedLeft, speedRight); } else { runBlinkgogo(0, 0); } } //检测Ln是否压黑线 boolean onLine(int Ln) { return !digitalRead(Ln); } void detectBlink() { if (onLine(2) &amp;&amp; onLine(3)) digitalWrite(13, LOW); else digitalWrite(13, HIGH); } //传入左右电机运动参数,参数有效范围-256至于+255, //但近0附近数值因摩擦阻力等存在死区,约-40至+40,导致电机无法转动 void runBlinkgogo(long leftSpeed, long rightSpeed) { if (leftSpeed &gt;= 0)
  {
    //6→11
    analogWrite(6, leftSpeed);
    digitalWrite(11, LOW);
  }
  else
  {
    //11→6
    analogWrite(11, 0 - leftSpeed);
    digitalWrite(6, LOW);
 
  }
  if (rightSpeed &gt;= 0)
  {
    //5→10
    analogWrite(5, rightSpeed);
    digitalWrite(10, LOW);
  }
  else
  {
    //10→5
    analogWrite(10, 0 - rightSpeed);
    digitalWrite(5, LOW);
  }
}

 

教程四:简单巡线和速度尝试

 

 

教程五:playMusic和速度参数调试lineFollower

 

 

教程六:寻光测试 lightFollower

 

 

教程七:走迷宫 goMaze

 

 

教程八:红外遥控控制原理和尝试测试

 

 

教程九:较大规模的程序功能划分与红外控制

 

 

教程十:集成手机应用程序的控制小车appControlBlinkgogo

 

 

W5200 以太网 扩展板 Arduino

欧美出口品质,国产价格,限时特价,限量促销,机不可失

原理图:http://i-element.org/makerstudio/W5200/Ethernet%20Shield%20v1.0%20sch.pdf

使用手册:http://i-element.org/makerstudio/W5200/MakerStudio%20Ethernet%20W5200%20Shield%20User%20Guide%20r1%20.pdf

Arduino使用范例代码:http://i-element.org/makerstudio/W5200/EthernetV1_0.zip

芯片相关参考手册:http://i-element.org/makerstudio/W5200/W5200_Datasheet.pdf

SIM900 GPRS GSM Arduino Shiled

欧美出口品质,国产价格,限时特价,限量促销,机不可失

 

原理图: http://i-element.org/makerstudio/GPRS/GPRS_GSM%20Shield%20v1.0%20sch.pdf

 

使用手册: http://i-element.org/makerstudio/GPRS/MakerStudio%20GPRS%20GSM%20Shield%20User%20Guide%20r1%20.pdf

 

Arduino使用范例代码: http://i-element.org/makerstudio/GPRS/GPRS_Shield.zip

 

芯片相关参考手册: http://i-element.org/makerstudio/GPRS/SIM900datasheeet.zip

 

Arduino寄存器操作

很多人都在向我询问关于如何直接使用Arduino中断的问题。要搞清楚这方面的事情,需要先了解Arduino使用的单片机ATmega328的内部寄存器。

要搞清楚这个问题,我们需要先获得一份ATmega328的Datasheet(数据手册),这是一款采用AVR架构的8位单片机。Datasheet是一份长达400多页的文档,告知了关于如何使用这款单片机的方方面面。

当我们使用PDF阅览器查看左侧的目录索引,我们先找到AVR CPU Core部分,查看概览Overview,我们能找到该款CPU的内部模块结构示意图。其中的ALU(算术和逻辑运算单元)部分,是用于算术和逻辑运算的核心部分,如加减乘除、位与或非运算等等。运算的数值来自23个8位的通用功能寄存器,也可将结果存放于这些寄存器中。8bit(8位)也就是1byte(一字节),还有其它的一些寄存器如Instruction Register指令寄存器等等。此外与8位Data Bus数据总线相连的还有I/O Module(输入/输出端口模块)。

你可以将Processer(处理器)想像成厨房,ALU(算术和逻辑运算单元)就像是大厨,根据instruction指令来准备晚餐。他是执行指令并采取响应的责任主体,大厨根据菜谱的步骤来开展工作,就像是编程过程中的程序代码。而厨房中的锅碗瓢盆等容器就是Register(寄存器),用于存放等等烹饪的食物,在处理器中也就是数据。

然而,当我将这些输入写入特殊功能寄存器SFR(sprcial function register)之中,它就可能直接导致控制器的某些引脚的电压从0V上升到5V。好,让我们待会就来试试。特殊功能寄存器SFR用来控制引脚的功能和输入输出,设置中断,发送或者接收串行信号等等。你需要知道的是,寄存器的种类数量以及名称是与处理器架构密切相关的,譬如你在ATMega328P控制器上做开发,当你迁移到ESP32控制器上时,你需要重新记忆一系列新的寄存器。

ATMega328P有三各分别编址的存储器,第一个是程序存储器(Program Memory),这里存储着你所编写的代码,当你编写代码,被编译后成为机器代码,就被存储在这里。这是一系列的操作指令,就像是菜谱一样,大厨操作时必须遵循的。第二个是SRAM(static random-access memory)静态随机存储器,有趣的是,我们上面所提及的通用寄存器和特殊功能寄存器都在这里的前256个存储单元中。所以,当我需要写入特殊功能寄存器数据时,我们需要先找到其在SRAM中的相应地址,然后配置好我们需要写入的数值。SRAM剩余的部分用于存储数值,如你在程序中所命名的变量等。请注意,当你的处理器重启或者断电后,SRAM中的所有数据将被清除,你将丢失所有存储于此的数据。最后第三个,就是EEPROM(elecrtically erasable programmable read-only memory)电可擦除只读存储器,它通常不被认为是处理器中的部分,由于其往往在另外的总线上与处理器进行通信,它的读取和写入速度也远较其它存储器慢。但它对于需要在断电后启动仍需保存使用的数据非常有用。

如果我们看一下I/O port章节部分,我们就可以知道一般数字输入输出端口的内部电气结构。在ATMega328P处理器中,所有I/O端口均可被配置为数字输入或输出端口,但是有些端口同时还可以被配置为通用串行收发端口、外部中断端口、模拟数字转换端口。

查看一下Pin Configurations章节,可以看一下DIP封装芯片的引脚分布,这就是Arduino UNO上所使用的处理器。你可以看到I/O端口命名以字母P开头,名字为B、C、D再加上一个端口数字。举例来说,我们可以向触发一个端口控制LED亮灭,该端口为PD5。需要使用一个引脚作为数字输入输出,我们需要配置3个寄存器PORT、DDR、PIN。让我们再导览到I/O Ports Register Description小节,了解更深入的信息。首先,我们需要配饰DDR(Data Direction Register)寄存器用于定义该端口的功能是输入R还是输出W。把DDRD中相应的端口位的值置位为1,意味着告诉处理器该位对应端口我们将用作输出功能,反正重置该位为0则告知处理器该对应端口将用作输入功能。接下来就是PORT寄存器,不要困惑,我们现在要操作的是D端口,那么对应的寄存器当然是PORTD,在前面配置了端口为输出功能后,将该寄存器对应位设置为0则该引脚输出0V电压,设置为1则该引脚输出5V电压。如果之前的DDR寄存器将该位对应端口设置为输入,则PORT寄存器对应位设置为1表示内部上拉电阻有效,设置为0表示内部上拉电阻无效。最后PIND寄存器相应位只能读取不能写入,它表示对应端口配置为输入时盖输入位引脚电平的高低。

我们待会就要实际演示 一下具体如何操作,不过,让我们先看看这些相关寄存器在SRAM中的分布位置和对应地址。导览到register summary一节,在表头我们可以看到每个寄存器的相应地址。

 

魔方破解机器人教程

拿到套件后,第一件事情就是清点一下零件数量是否有缺,部分消耗品或配件(如USB连接线、白乳胶、镊子)外观可能因不同批次有所差异,并不影响使用,部分易得选配件(如电池)可能不会附赠。

序号 名称 数量 功能 备注
1 木板A 1 搭建魔方破解机器人主体,支撑固定其他零件
2 木板B 1 搭建魔方破解机器人主体,支撑固定其他零件
3 木板C 1 搭建魔方破解机器人主体,支撑固定其他零件
4 木板D 1 搭建魔方破解机器人主体,支撑固定其他零件
5 木板E 1 搭建魔方破解机器人主体,支撑固定其他零件
6 扩展板 1 引出主控板连线,便于与舵机直接连接
7 主控板 1 接收电脑动作信号并转换为舵机运动指令
8 塑料舵机 1 用于带动旋转魔方基底的运动 与舵盘连接处白色
9 金属舵机 1 用于保持、释放和翻转魔方 与舵盘连接处黄色
10 电池盒 1 用于存放3节五号电池并给舵机供电 仅凭USB数据线来自电脑主板的供电无法使两个舵机正常运转,使用过程中
11 螺丝螺母收纳纸盒 1 收纳用于固定舵机和主控板与木板支架的螺丝和螺母
12 高质量魔方 1 高质量魔方 低质量魔方不能容忍旋转角度误差,旋转不到位,翻动到另一个面旋转时会卡住
13 USB数据线 1 用于给主控板烧录程序以及与电脑通信接受
14 五号电池 3 用于给舵机供电 不用依靠电脑供电,舵机会因供电不足而卡顿
15 十字螺丝刀 1 用于安装螺丝螺母和电池盒与拓展板之间的供电线连接
16 镊子 1 用于不便于手伸入的位置夹持和安装螺母,尤其是带尼龙圈的紧固螺母
17 白乳胶 1 没有热熔胶时使用用于木板间连接,但固化需要数小时之久,且不可加热拆卸,容易损坏木板 推荐使用热熔胶

 

结构拼装

魔方托盘

魔方卡手

主体安装

主体安装完成后,即可参考以下照片完成安装,有旋转部位的螺丝需要使用尼龙防松螺母,保证运转过程中不会因震动而松脱。

逐步安装过程拍照:

 

舵机接线参考

G V S

端口号

5

6

电池盒接线参考

VCC

电池盒红线

GND

电池盒黑线

打开设备管理器

在“我的电脑”或者计算机,右键它弹出菜单表,点击“管理”;(仅限于win7系统的用户)

在计算机管理页面左侧列表,可以找到“设备管理器”双击它,中间会显示硬件和设备是否正常的信息。有黄色感叹号就代表者有问题。

如果您的电脑买安装此驱动,需要参考以下网址,安装CH340驱动后,电脑即可与Arduino通讯

win7 http://www.arduined.eu/files/CH341SER.zip

win8 http://www.arduined.eu/files/windows8/CH341SER.zip

Mac http://kig.re/downloads/CH341SER_MAC.ZIP

Mac https://github.com/adrianmihalko/ch340g-ch34g-ch34x-mac-os-x-driver

点击[INSTALL],就可以完成驱动程序安裝。

确保驱动程序已经安装后,即可烧录Arduino程序

打开上述文件夹后

打开

程序运行

点击Upload

成功安装后,运行上位机

下列界面显示表示已经成功和Arduino通信

填上魔方颜色后,点击SOLVE,获得解答步骤后,点击SEND,即可

主控板烧录程序成功后,开机时魔方的基座旋转舵盘会归位,翻转手臂会自动翻转魔方一次。可视此过程为开机自检。如果此过程不正常,则需要重新剥离舵盘和舵机,以调整初始位置。

基座塑料舵机初始位:与翻转手轴线平行

翻转卡手舵机初始位:应远离魔方,卡在图中红色圈相应位置

 

如魔方运转过程中卡顿,请检查电池盒开关是否打开,电池盒与扩展板接线是否牢靠?

 

提示:上位机程序看上去魔方的正面是以翻动魔方手臂的方向看去为前方,即下图所示

程序调试部分支持信息提示:

 

先简单介绍一下舵机的基本知识。舵机简单的说就是集成了直流电机、电机控制器和减速器等,并封装在一个便于安装的外壳里的伺服单元。能够利用简单的输入信号比较精确的转动给定角度的电机系统。

舵机除电源外,只要一根信号线即可;使用PPM(脉冲比例调制)信号控制;所谓“PPM”,是一个周期约20ms,其间有个宽度在2ms 左右的脉冲控制信号。一般是以1.5ms 为基准,此时舵机居中,小于1.5ms 舵机左转,大于1.5ms,舵机右转;至于角度和脉冲宽度关系各个产品不同,例如:0.5ms 对应左转90 度,2.5ms 对应右转90 度。

 

由于使用不同的舵机采用的具体脉冲不同,即便是同一型号的舵机也因为死区不一致性,初始位置安装误差等,导致原始程序在部分用户安装的魔方破解机器人上不能正常工作。现根据我们所选用的舵机(塑料舵机:Futaba S3003、金属舵机:TowerPro MG995)上图图示情况进行简单的说明。

1ms(毫秒)=1000us(微秒),所以对应的情况是

500us =  0°

1000us = 45°

1500us = 90°

2000us = 135°

2500us = 180°

变化区间2000us内涵盖角度0-180°,由此可见脉宽每增加或减少约11us,舵机摆动角度相应改变1°。

想要了解更多知识,请参考http://www.i-element.org/servo/

 

现在我们来分析上下位机中对应的需要调整的程序参数。在控制板烧录完程序以后,每次上电启动,魔方破解机器人都会进行一次魔方翻转运动,由此时,你可以观察魔方是否被正确顺滑翻转。你也可以在上位机传送命令F(Flip)翻转,让机器人执行此指令,如下图所示

此外,上位机发送的全部指令一共就三种F(Flip)、H(Hold)、T(Turn)指令默认用空格隔开,对于一段魔方解答的结果就是由这三种指令的结果组成。(为了让部分有兴趣了解其算法的朋友能深入学习,后续我们将继续补充教程,针对此结果产生的算法进行讨论)目前我们仅讨论舵机参数需要调整以确保上诉3个动作能够完整的运行。

手臂舵机(armservo)总的来说有三个位置,对应3种指令

F(flip)翻转指令必须要保证手臂和魔方高度匹配,在中间黑色示意的导向区必须保证翻转动作后能自由落下到卡位,所以两块三角形导向板之间的连接螺丝必须保持适当的松紧度。

H(hold)把持指令执行时,手臂运动到此位置时,必须保证魔方的上两层被抓手握住,在魔方基底旋转时,魔方能被正确旋拧90度。

T(turn)旋转指令执行时,手臂必须退到导向板卡槽处附近,并向上倾斜约45度,手臂在此位置时,魔方基底旋转不会被手臂任何部位所阻碍。

接下来,我们看一下,在程序中,以上三个位置对应的参数

显然,

OFF对应T指令时的位置

HOLD对应H指令时的位置

PUSH对应F指令时的位置

你可以通过上述舵机的基本知识得到相应的关系去调整此3个参数,并重新烧录程序到Arduino控制板,获得手臂位置的微调。

需要注意的是,当上位机正在运行并与控制板通信时,烧录新程序将失败,因为两个程序竞争,只有能一个程序获得通过串口与控制板通信的权利。

也部分读者可能会问,为什么不是if-else语句中if下的3个参数,那是因为我们舵机可以正反安装,当反向安装时,上面的3个参数对应的位置才有效,否则默认执行else语句下的三个参数。

基底舵机(baseservo)总的来说有四个位置,分别在指令H和T中起作用

仔细观察的读者可能已经发现,放置魔方的基底托盘并不是刚好能放下魔方,而是比魔方略大,大概宽出3-4mm。这是多方面的原因导致的,但最直接的原因就是因为翻转魔方时需要空间,同时需要兼容导向板等可能产生的误差,这个道理同样适用于卡爪上,手臂最前端的卡爪也不能是恰恰好能卡住魔方而不多留一点剩余的空间。

这种容乃误差的做法,同样会给魔方扭转过程带入其它的新问题,如卡爪和底座都有空间,那么当卡爪把持魔方,底座完全旋转90°时,问题就出现了。由于空隙的存在,魔方往往不能恰好转到90°的位置。当一个位置扭不到准确的90°时,翻转或者旋转90°再扭时,魔方将会卡壳,甚至是损坏。由于我们选配了可以容错的高质量魔方(超过20元一个,而不是那种几块钱的魔方),这个问题其实已经可以容纳非常宽松的偏差,扭不到位的魔方在侧面再拧时会自动修复不到位的一面,目测10°以内不会有问题。即便如此,我们还是希望利用程序中的修正参数,把这个问题说清楚。

 

在魔方基底旋转的过程中,有原位和90°旋转位两个基本位置。几乎是同理加上了后缀词(over)。也就是说,当魔方基底选择时,先转到over位,然后再回到基本位,利用过转的这个超调量,克服每次动作时卡爪和基底的空隙带来的魔方90°旋转不到位。

基于上述的理论,你就会知道,当每次执行H(hold)指令后,如果魔方扭不到90°的正确位置,那么你就应该要尝试调整上面的4个参数咯。

学习,理解,锻炼,在充分思考后动手,我相信这次DIY的成功一定会磨炼出你的耐心和细心,创客精神与你我一同砥砺前行吧!

接线端子和各类连接器的基础知识

引言

接线端子用于将分开的电路连接到一起。通常这些连接器用于常需要切换和断开的场合,如连接电源,连接外围电路,或者需要更换的扩展部分。

该教程涵盖内容

在本教程中,我们将介绍下面主题

  • 关于接线端子的常见术语
  • 将接线端子进行区别分类
  • 介绍上述分类之间的区别
  • 介绍如何使用极性防反的接线端子
  • 介绍如何使用极性防反的接线端子

建议先阅读

在您开始阅读本文之前,请确保您已经知道或者学习了以下教程中所罗列的内容:

接线端子术语

在我们开始讨论一些常用的连接器之前,让我们来探讨用于描述接线端子的术语。

公母端子Gender – 接线端子的公母性说明了它是用来插入还是被插入的。(哈哈,如果你还是单纯的孩子,更详细的解释估计你得去问问你父母)遗憾的是,有些被称为公头的端子,实际上是按照母头的端子来使用的。在接下来的示例中,我们将将说明这些缘由。

Male and female 2.0mm PH series JST connectors

左边公右边母的 2.0mm PH系列的JSP接线端子

极性-大多数接线端子有约定的极性方向。这种特性使得接线端子可以防止接反。

North America wall plug

有极性的美规墙上插头。 通过为插头叶片两种不同的宽度,插头只能单向进入插座

触点-触点是接线端子真正起作用的功能部分。 它们是彼此接触的金属部件,形成电气导通的连接。 这里也往往是导致连接不良的地方:触点可能变脏或氧化、或者金属弹片的弹性随时间蠕化变小而将导致触点松脱或连接不可靠。

ADH8066 mating connector

该连接器上的触点清晰可见。

间距 – 许多连接器由重复排列的一组触点组成。 连接器的间距是从一个触点的中心到下一个触点的中心的距离。这一点很重要,因为有许多接线端子外观和触点看起来非常相似,但间距可能不同,所以往往一个型号系列的端子仅仅因为这个参数不同而不同,因此在不知道此参数情况下,很容易在购买了不能配对连接端子。 

 

.1" pin header connector examples

标准Arduino上标题的引脚间距为0.1英寸。

插拔次数 – 接线端子的使用寿命都是有限的,每次接上和断开接线端子都会导致部分磨损。 数据表通常以插拔次数这一指标来表示其使用寿命,使用不同技术的接线端子插拔次数差别很大。 USB连接器可能具有数千或数万次插拔的寿命,而设计用于消费电子产品内部的板对板连接器可能会被限制为数十次插拔的寿命。 选择适合应用场景寿命的接线端子非常重要。

Connector for GS406 GPS module

GS406 GPS模块的匹配连接器。 该连接器的数据表显示该零件的插拔次数是50次。

安装方法 – 这个可能会让人有些困惑。 术语“安装”指以下几种情况:连接器如何在使用中安装(安装在面板上,自由悬挂着,电路板安装),连接器相对于其附件的角度(直角或直角),它如何机械连接(焊片焊接,表面贴片焊接,通孔焊接)。 我们将用示例对接线端子中的安装方法进一步讨论。Comparison of different mounting methods for barrel-type connectors

比较三种相同管连接器的不同安装方法:(从左到右)电路板板安装,内联电缆安装和板面安装。

抗弯折延伸部分(用于减缓应变) – 当连接器安装在电路板或电缆上时,线材拐弯处的连接往往有点脆弱。 通常提供某种类型的抗弯折延伸部分用于减缓应变,以将作用于该连接器的任何应变传递到更多更合理的结构上。 后面还有这类型的例子。

1/8" Headphone jack showing strain relief

这个1/8英寸耳机插孔带有一个应力消除”靴子“,滑过电缆以防止电缆上的力量直接传输到电气接头。

USB连接器

USB连接器有两种类型:主机和从机。 在USB标准中,两者有所不同,电缆和设备上的连接器反映了这一点。 但是,所有USB连接器都有一些共同之处

  • 极化 – USB连接器只能按正确一面插入。 从不对的方向无法插入,强行插入连接器不会工作,并可能导致其损坏。
  • 四个触点 – 所有USB连接器至少有四个触点(尽管有些可能有五个,而USB 3.0连接器有更多)。
  • 这些用于电源,接地和两条数据线(D +和D-)。 USB连接器是设计用于传输5V,高达500mA电流的连接器。
  • 屏蔽 – USB连接器是自带屏蔽的,外部包围了不属于电路的金属外壳。 这对于在具有大量电流“噪音”的环境中保持信号完好无损很重要。
  • 强大的电源连接 – 电源引脚在数据线之前先完成连接这点非常重要,以避免试图通过数据线供电。 所有USB连接器的设计都考虑到了这一点。
  • 减缓应变 – 所有USB电缆都在连接器上进行塑料包覆成型,以防止电缆上出现可能损坏电气连接的应变。

Labeled image of USB extension cable

USB延长线,标有USB连接器的一些常见功能。

USB-A接口

USB-A母头是标准的“主机”连接器类型。 这可以在计算机,集线器或任何打算将外围设备上找到。 也可以在另一端找到带有A型连接器和A型连接器的延长电缆。

USB-A ports on a laptop computer.

笔记本电脑侧面的女性USB-A端口。 蓝色连接器符合USB 3.0标准。

USB-A公头是标准的连接外围扩展设备的连接器。 大多数USB电缆的一端将以USB-A公头连接器终结,而许多设备(例如键盘和鼠标)将具有内置电缆端接有USB-A公头连接器。 也可以找到可安装在板上的USB-A公头连接器,适用于U盘等设备。

USB-A male connector examples

两种类型的USB-A公头接口,SparkFun Cerberus电缆和AVR Stick开发板。

USB-B接口

USB-B母头是外围设备的标准。 它体积稍大,但坚固耐用,所以在不限制尺寸的应用场景中,它是为USB连接提供可移动连接器的首选方法。 它通常是通孔板安装的连接器,以获得最大的可靠性,但也有板面安装的方式。

USB-B connector on an Arduino Uno

由于其低成本和耐用性,包括Uno在内的Arduino主板早已使用了USB-B母头连接器。

USB-B公头多数位于电缆的末端。 USB-B电缆无处不在,价格低廉,这也有助于USB-B连接的普及。

Male USB-B connector

SparkFun Cerberus电缆末端的USB-B公头连接器

USB-mini接口

USB-Mini连接是第一个用于较小设备的USB接口尺寸标准的尝试。 通常在较小的外围设备(MP3播放器,旧手机,小型外置硬盘驱动器)上可以找到USB-Mini母头,通常是表面贴装连接器,具有较大的尺寸稳定性。 USB-Mini逐渐被逐渐淘汰,转而使用USB-Micro连接器。

USB-Mini female connector

Protosnap Pro Mini上的USB-Mini母头接口。

USB-Mini公头是另一种仅有线缆的连接器。 与USB-B一样,它非常常见,几乎可以在任何地方以便宜的价格找到此连接线。

USB-Mini male connector

SparkFun Cerberus电缆末端的USB-Mini公头接口。

USB微型连接器

USB-Micro是USB连接器系列的新增产品。与USB-Mini一样,主要关注是缩小尺寸的问题,但USB-Micro为低速信号增加了第五个引脚,使其可用于USB-OTG(On-the-go)应用,其设备视情况而定,作为主机或外设运行。

USB-Micro母接口可以在许多新型外设上找到,例如数码相机和MP3播放器。 USB-micro作为所有新手机和平板电脑的标准充电接口,意味着充电器和数据线越来越普遍,而USB-Micro已经取代USB-Mini作为小尺寸USB连接器的选择。

USB-Micro female connector

LilyPad Arduino USB板上的USB-Micro母接口。

USB-Micro公头也是一个只有线缆的连接器。 通常有两种类型的带USB-Micro公端的电缆:一种用于连接具有USB-Micro端口的设备作为USB主设备的外设,另一种用于将USB-Micro母端口连接至USB-A母端口 ,用于支持USB-OTG的设备。

USB-Micro male connector

SparkFun Cerberus电缆上的USB-Micro公头连接器。

USB-A female to USB-Micro adapter

适配器尾纤,用于使用仅具有带标准USB外设的USB-Micro端口的USB-OTG设备。 请注意,并非所有支持USB-OTG的设备都可以使用此尾纤。

译者注:现在随着USB3.0普及和无容错设计思路的要求,更多的手机和外置设备从USB-Micro接口转向使用USB-type C接口,包括最新的苹果Macbook。但苹果手机和平板目前仍在使用苹果独家专利的lighting连接线。

维基百科上,关于各类型USB接口样式的示意图

维基百科上,关于各类型USB-Type-C接口的样式示意图

最新使用了USB-Type-C接口的苹果笔记本电脑Macbook

音频连接器

另一个熟悉的连接器是那些用于视听应用的组合–RCA俗称梅花头、莲花头和唱机。 虽然这些不能真正被认为是同一个家族,由于其结构、连接方式和原理雷同,我们将它们归为一类在此介绍。

“电话”类型连接器

您可能会立即将此连接器的1/8“版本识别为耳机末端的插头,这些连接器实际上有三种常见尺寸:6.3英寸(6.35毫米),1/8英寸(3.5英寸 毫米)和2.5毫米¼英寸尺寸连接器在专业音频和音乐界有很多用途 – 大多数电吉他和放大器上都有1/4英寸尖端套(TS)插孔,1/8英寸tip-ring- sleeve(TRS)结构的输出信号的连接器作为MP3播放器或电脑上的耳机或音响非常普遍。 一些手机将提供一个2.5毫米tip-ring-ring-sleeve(TRRS)插孔,用于连接耳机,该耳机还包括用于免提通话的麦克风。

这些连接器和电缆的普遍可用性使其成为通用连接应用的良好选择 – 例如,早在USB之前,德州仪器的图形计算器就使用2.5mm TRS连接器作为串行编程连接器。 应该记住的是,tip-sleeve(端头 – 套筒)连接器类型不可用于传输电源; 在插入过程中,尖端和套筒可能会短时间短接在一起,这可能会损坏电源。 屏蔽不足使得它们不适用于高速数据,但低速串行数据可以使用这些连接器。

1/8" TRS phone plug

耳机型TRS电话插头,1/8“。通常,尖端tip和环ring将承载立体声音频信号,而套sleeve将接地。

1/8" TS phone plug

1/8英寸手机插头,请注意此连接器上没有环ring触点。

1/8" board mount headphone jack

1/8“板载耳机插孔,带有相应引脚连接的插针标记。当未插入插孔时,内部开关将尖端和环形引脚连接到相邻的未标记引脚,从而允许插入检测。

RCA连接器

RCA俗称梅花头、莲花头,是数十年来首选的家用立体声连接器,于1940年由RCA引入家用留声机中。 它在视听领域正逐渐被HDMI等连接所取代,但无处不在的连接器和电缆使其成为家用系统的理想选择。 它已经服役了很长的时间。

母端RCA连接器通常可在设备上找到,但可以找到带有母插孔的分机电缆或转接电缆。 大多数RCA连接器都连接到四种信号类型之一:分量视频(PAL或NTSC,取决于设备的销售地),复合视频,立体声音频或S / PDIF音频。Female RCA plug, for video signals.

RCA母头连接器,用于视频信号。 通常,NTSC或PAL视频信号连接器将呈黄色。

RCA公头连接器通常在早起的影碟机和电视连接的电缆上找得到。Male RCA plugs

RCA公头。 红色和白色通常用于音频应用,红色表示右声道的音频。

电源连接器

虽然许多连接器除数据外还承载电源,但某些连接器专门用于为设备提供电源连接。 这些因应用和尺寸而异,但我们只关注一些最常见的部分。

DC直流电源插头插座

DC直流电源插头插座通常用于低成本消费类电子产品,可通过大型AC电源适配器插入墙上电源。 壁式适配器广泛适用于各种额定功率和电压,使DC直流电源插头插座成为将电源连接到小型项目的常用手段。

DC直流电源插座或插孔可以以多种类型购买:PCB安装(表面贴片焊接或通孔焊接),电缆安装或板面安装。 这些连接器中的一些将具有额外的接触点,以允许应用程序检测电源是否插入到筒状插孔中,从而允许设备在外部电源上运行时绕过电池并节省电池寿命。

Female barrel connector

DC直流电源插座。 当没有插入插头时,“插入检测”引脚将短接到“套筒”引脚。

虽然有多种方法将插头连接到电线的末端,但是通常只能在电线端子中找到公插筒连接器或“插头”。 也有可能获得预先连接到电缆的插头。

Male barrel plug

独立的DC直流电源插头,用于连接任何电源。 请注意,套筒连接设计为压接在导线上以额外消除应力。

桶式连接器仅提供两个连接,通常称为“销”或“尖端”和“套筒”。 订货时,筒体连接有三个不同的特点 – 内径(插座内插针的直径),外径(插头外侧套筒的直径)和极性(套筒电压是否为 高于或低于尖端电压)。

套筒直径通常是5.5mm或3.5mm。

销直径取决于套筒直径; 一个5.5毫米的套筒将有一个2.5毫米或2.1毫米的引脚。 不幸的是,这意味着为2.5mm引脚设计的插头将安装在2.1mm插孔中,但连接最多只能是间歇性的。 3.5毫米套筒插头通常与1.3毫米插针插孔配合。

极性是最后要考虑的方面; 通常,套管将被视为0V,并且尖端将相对于套管成为正电压。 许多设备将有一个小图标表明设备所期望的极性; 应注意遵守这一点,因为不正确的电源极性可能会损坏设备。

两个套管尺寸的长度通常为9.5毫米,但是更长和更短的套管确实存在。大部分产品均使用正极性5.5毫米套筒和2.1毫米引脚; 我们建议尽可能坚持标准,因为它更容易维修和更换。Barrel connector polarity label

AC适配器与套筒的公共极性图。 正极性(尖端正极,套管0V)是最常见的。 图表由维基百科用户提供。

“Molex”端子

大多数计算机硬盘驱动器,光盘驱动器和其他内部外围设备通过通常称为“Molex”端子供电。 为了更加准确,它是一个Molex系列8981连接器 – Molex实际上是最初在1950年代设计这种连接器的公司的名称。

Molex连接器设计用于承载大量电流:每个引脚最多11A。 对于可能需要大功率的项目(例如CNC机器或3D打印机),为项目提供动力的常用方法是使用台式PC电源并通过Molex连接器连接各种系统电路。

Molex端子就是术语公母头中有点反常的例子。 母头端子通常位于电缆的末端,并且在包围公头端子内的插针的塑料外壳内滑动。 通常情况下,连接器只能压入,非常非常紧 – 为保证连接牢固可靠,它们通常只能连接和断开数十次,因此对连断频繁的系统来说,这不是一个好的选择。

Male Molex connector

Molex端子。 连接器的引脚的公母是指整个连接器而非金属部分。

Female Molex connector

在项目电源上的公Molex端子。

IEC连接器

与Molex连接器一样,这是一种通用组件名称与单个特定项目同义的情况。 IEC连接器通常是指台式PC电源上常见的电源插口。 严格来说,这是IEC 60320-1 C13(母)和C14(公)连接器。

IEC 60320-1 C14 male connector

C14公头IEC电源插座,位于DC项目电源上。 请注意,与Molex连接器一样,连接器的公母由盖内的引脚定义。

C13 female IEC power connector

C13母IEC电源连接器,使用相当标准的交流电源电缆。 这一端的电缆可以在世界各地找到,通常在另一端使用主要的本地交流电连接器。

IEC连接器几乎专门用于交流电源输入。 在项目中使用它的好处在于,IEC对市电电缆非常普遍,并且可用于大多数国际地区的本地化市电插头!

JST连接器

我们的Arduino项目中,经常提到“2.0mm JST连接器”。 这是特定产品的又一次推广–JST是一家生产高品质连接器的日本公司,2.0mm JST连接器是PH系列双位置极性连接器。

很多单节锂聚合物离子电池均标配这种JST连接器,并且许多电路板都包含此连接器(或其引脚的焊盘孔)作为电源输入。 它具有结构紧凑,耐用并且防反的优点。 另一个可能是优点或缺点的特性,取决于你如何看待它,是因为JST连接器在插入后很难断开连接(虽然小心应用斜口钳可以帮助!)。 虽然这使得在使用过程中不可能出现故障,但这也意味着断开电池充电容易损坏电池连接器。

2-Pin JST male connector on a LilyPad Arduino USB board

LilyPad Arduino USB板上的2引脚JST公头连接器。 再次,与Molex一样,胶壳内的引脚决定了连接器的公母。

Male and female 2-pin JST connectors

公母型2针JST连接器。Male and female 2-pin JST connectors.

PH系列连接器有两个以上的接线位。 但是,我们最常用的应用是用于2位电池连接。

排母连接器

排母连接器包含几种不同的连接方式。 一般来说,一面是焊接到PCB上的一系列引脚,它们可以与PCB表面成直角(通常称为“直线”)或平行于电路板表面(易混淆地称为“右边” – “角”)。 这种连接器以各种间距(如2.54mm和2mm)出现,并且可以具有任意数量的单独的排针。

Right angle female header pin connector

FTDI基础板上的直角母头引脚连接。

最常见的针脚头是0.1英寸单排或双排连接器,它们有排针或排母,并且是用于连接Arduino板和屏蔽板的连接器。其他的间距并不少见,例如XBee无线模块使用 相同连接器的2.0mm间距的系列。

.1" pin header connector examples

Arduino Uno电路板上的0.1英寸排母连接

这部分的常见变种是圆孔排针的版本。 虽然正常版本是由冲压和折叠金属板制成的,但是圆孔排针是通过将金属加工成所需的形状而形成的。 其结果是一个更坚固的连接,具有更好的接头和更长的使用寿命,但其成本也更高。

Female machine pin headers

圆孔排针,请注意,这些连接器被设计成可以分割成较小的部分,而标准的0.1英寸母头连接器不是。还需要注意的是,并非所有非机器针头连接器都将与机器针脚配合使用。

连接到这些引脚接头的电缆通常为以下两种类型之一:带有压接连接器的单根电线或带绝缘位移连接器的带状电缆。 这些可以简单地夹在排缆杜邦线的末端,从而形成与带状电缆中每个导体的连接。 通常情况下,杜邦线只能作为母头使用,并期望公头排针与之配对。

Crimp connected header cable

六位杜邦线排缆。 每条导线都被单独剥去,连接器压接在上面,然后将连接器插入塑料胶壳中。

2x5 insulation displacement connectors on a ribbon cable

带状电缆上的2×5绝缘位移连接器(IDC)。 这种电缆可以快速组装,因为它不需要剥离单个连接器。 它的两端还有偏移头,以防止插入配对板侧连接器时接反。

临时连接器

螺丝接线端子

在某些情况下,可能需要将裸露的导线连接到电路。 螺丝端子为此提供了一个好的解决方案。 它们也适用于连接应该能够支持多种不同连接设备的情况。

螺丝端子的缺点是它们可以很容易地解开,在电路中留下一根裸露的导线。 一小撮热胶可以解决这个问题,而不会以后太难去除。

螺丝端子通常设计用于窄范围规格的电线,电线太小与太大都不行。 常见有两种类型的螺钉接线端子0.1英寸和3.5mm版本。大多数螺钉端子都是高度模块化的,只需将两个或多个较小的部分连接在一起即可轻松地以相同的间距进行扩展。

3.5mm screw terminals– > 3.5毫米间距的螺钉端子,显示要连接的导线的插入点,固定导线的螺钉以及单个单元侧面的模块化连接器,可以将多个部件组合在一起。

香蕉连接器

大多数电源测试设备(万用表,电源)都有一个非常简单的连接器,称为“香蕉插座”。 这些配对“香蕉插头”,卷曲,弹簧金属插头,意味着做一个单一的电源连接。 它们经常以可堆叠配置提供,并且可以轻松连接到任何类型的电线。 它们能够承载几安培的电流并且价格低廉。

Banana plug

可堆叠的香蕉插头。 请注意,有两种不同的方法可以插入额外的香蕉插头。

Variable power supply with banana plugs

Extech可调台式电源,前部带有香蕉插孔。

鳄鱼夹

命名原因显而易见,鳄鱼夹适用于接线柱或裸线的测试连接。 它们往往体积庞大,容易对附近的裸金属造成短路,并且具有相当差的抓地力,易于损害某些连接部位。 它们主要用于调试期间的低成本连接。

Alligator clips

“第三只手”的工具使用鳄鱼夹夹住工件,用鳄鱼夹夹住电线进行电气测试。 请注意鳄鱼夹周围的塑料套,以防止其他连接短路。

IC夹(或IC钩)

对于更精细的探测操作,市场上有各种IC夹。 这些尺寸允许用户将其夹在IC的引脚上而不接触相邻的引脚; 其中一些非常细腻,甚至可以夹在细间距的SMD元件支脚上。 这些较小的剪辑可以在逻辑分析仪和测试导线上找到,这对原型设计或故障排除电路来说非常有用。

Large IC clip

电线末端的大型IC夹。 该夹子仍然足够小,可以连接到通孔芯片上的单个支脚,而不会对邻近的引脚造成问题。

其他连接器

RJ型模块连接器

认证插孔连接器是电信设备进入本地交换机的标准配置。 通常听到的与之相关的名称(RJ45,RJ12等)不一定是正确的,中文俗称水晶头,因为RJ标志是基于位置数量,实际存在的导线数量和布线图案的组合。 例如,虽然标准以太网电缆的末端通常被称为“RJ45”,但RJ45实际上不仅意味着8位,8导体模块插孔,还意味着它与以太网连接。

这些模块化连接器可以非常有用,因为它们结合了可用性,多导体,适度的灵活性,低成本和适中的电流承载能力。 尽管这些电缆本来不是要提供大量的电源,但可用于将数据和几百毫安的数据从一个设备传输到另一个设备。 应注意确保为此类应用提供的插孔不会连接到传统的以太网端口,否则会导致损坏。

8p8c "RJ45" style modular jack

标准8p8c(8位,8芯)“RJ45”模块化插孔。 请注意,如果您打算使用此类插孔传输直流信号和电源,则必须避免使用带内置信号变压器的连接器。

D-sub型连接器

以其外壳的形状命名,D超小型连接器是计算世界的经典标准。 这种连接器有四种非常常见的品种:DA-15,DB-25,DE-15和DE-9。 管脚编号表示提供的连接数,字母组合表示管壳的大小。 因此,DE-15和DE-9具有相同的外壳尺寸,但具有不同数量的连接。

Female board-mount DE9 connector

DE-9母头板载连接器。 公母由与每个信号相关联的引脚或插座来定义,而不是整个连接器,使得该连接器尽管有效地插入到配合连接器的外壳中,仍然是母端。

DB-25和DE-9对硬件黑客最有用; 许多台式计算机仍然至少包含一个DE-9串行端口,并且通常还包含一个DB-25并行端口。 用DE-9和DB-25连接器端接的电缆也广泛使用。 与上述模块化连接器一样,这些可用于在两个设备之间提供电源和点对点通信。 同样,由于这些电缆的常用用途不包括电力传输,因此任何重新调整电缆的操作都要谨慎,这是非常重要的,因为插入标准端口的非标准设备很容易造成损坏。

更多可供深入学习的资料

现在您应该清楚哪些连接器最适合某些应用,哪些连接器将在您的下一个项目中对您有用。 请查看其他链接以更多地了解连接器。

  • Giant database 很全面的连接器和接口数据库 – 您场景的几乎任何连接器的简单介绍,如下图电脑背面的所有接口。 这是一个关于连接器基本信息的好网站,但对接口结束细节的描述不足。

  • Wikipedia article on registered jack connectors维基百科关于认证插孔连接器的文章 – 更多关于认证插孔(RJ)连接器的辨识,常被误解和误用的一些问题。
  • Wikipedia article on D-subminiature connectors维基百科有关D超小型连接器的文章 – 与认证插孔连接器一样,D型超小型标准的信息也很多。 维基百科有一篇很棒的关于它的文章。
  • Mouser电子产品目录 – 浏览电子产品供应商的目录通常是查找未识别连接器名称的好地方; Mouser增强型在线目录与打印版本一样好,而且不用浪费纸!

如果您希望浏览更多相关教程,请查看以下其他内容:

 


cc

原始文章采用CC BY-SA 4.0,您可以自由地:

  • 演绎 — 修改、转换或以本作品为基础进行创作
  • 在任何用途下,甚至商业目的。
  • 只要你遵守许可协议条款,许可人就无法收回你的这些权利。

本文由翻译美国开源硬件厂商Sparkfun(火花快乐)的相关教程翻译,原始教程采用同样的CC BY-SA 4.0协议,为便于理解和方便读者学习使用,部分内容为适应国内使用场景稍有删改或整合,这些行为都是协议允许并鼓励的。

原始文章及相关素材链接:

https://learn.sparkfun.com/tutorials/connector-basics