电子说
步骤1:设置硬件
设置很简单。我们将使用:
引脚4 - 11:键盘输入
引脚3:伺服电机输出
VCC(5V)
GND(接地)
键盘输入垂直向下连接。将键盘上的每根电线从右到左连接到引脚4-11。伺服电机直接连接到5V,接地和引脚3.在我的伺服(Tower Pro SG90)上,红线为5V,接地为棕色,输出引脚为黄色。检查伺服电机的文档。
步骤2:代码
让我们看一下代码:
#include
#include
// Set up keypad variables:
int numKeyPresses = 0; // Track number of key presses
int maxKeyPresses = 3; // Only allow 3 digits to be entered
int keyPresses[3] = { 0, 0, 0 }; // Initialize an empty array to hold input
const byte numRows= 4; // # of rows on the keypad
const byte numCols= 4; // # of columns on the keypad
// Set up servo variables:
int angle = 0; // Angle in degrees to position servo [0-180]
int angleMultiplier = 1; // Multiply by each digit, divide by 10 on each input
Servo servo; // Create the servo object
int servoPin = 3; // Set the servo pin
char keymap[numRows][numCols]= // Setup the keypad layout
{
{‘1’, ‘2’, ‘3’, ‘A’},
{‘4’, ‘5’, ‘6’, ‘B’},
{‘7’, ‘8’, ‘9’, ‘C’},
{‘*’, ‘0’, ‘#’, ‘D’},
};
在这里,我们导入键盘和伺服库来帮助进行一些输入和输出处理。 numkeyPresses变量跟踪已输入的条目数。当达到maxKeyPresses时,这将重置为0.键盘映射设置为4x4矩阵,模仿物理键盘。
// Connect keypad ROW0, ROW1, ROW2 and ROW3 to these Arduino pins.
byte rowPins[numRows] = { 11, 10, 9, 8 };
// Connect keypad COL0, COL1 and COL2 to these Arduino pins.
byte colPins[numCols] = { 7, 6, 5, 4 };
// Create the Keypad
Keypad kpd = Keypad( makeKeymap( keymap ), rowPins, colPins, numRows, numCols );
void setup()
{
Serial.begin(9600); // Start up serial comms
resetAngleMultiplier(); // Start accepting numeric input
servo.attach( servoPin ); // Attaches the servo to the servo object
} // setup
这里我们使用一个名为resetAngleMultiplier的方法,我将使用马上讨论一下。我们的想法是,我们希望在数学上将输入转换为可用数字,而不是字符。这使我们做到了这一点。
void loop()
{
char key = kpd.getKey();
if( key ) // Check for a valid key
{
if( key 》= 0x41 && key 《= 0x44 || key == 0x23 || key == 0x2A )
{
resetInput();
Serial.println( “ERROR: Numeric input only!” );
} // ^ if invalid entry
else // Else, entry is valid:
{
angle += angleMultiplier * ( key - 0x30 );
angleMultiplier /= 10;
if( numKeyPresses == maxKeyPresses - 1 )
{
setServo( angle ); // Use the input to turn servo
resetInput();
}
else
{
numKeyPresses++;
}
Serial.println( (String) angle );
}
} // if( key )
} // loop
这里我们接受输入并处理它。我们将讨论如何处理它。
void setServo( int angle )
{
if( angle 》 180 )
angle = 180;
Serial.println( “Setting servo to ” + (String) angle + “ degrees.” );
servo.write( angle ); // Set the servo position
} // setServo
void resetAngleMultiplier()
{
angleMultiplier = 1;
/* We started out with a multiplier of 10^0 (or 1)。 For each
number we want to accept, we want to have a multiplier one
order of magnitude greater. So, for example, for 5 digits, the
multiplier starts out as 10 000. */
for( int i = 0; i 《 maxKeyPresses - 1; i++ )
angleMultiplier *= 10;
} // resetAngleMultiplier
void resetInput()
{
resetAngleMultiplier(); // Reset the numeric input
angle = 0; // Reset the angle
numKeyPresses = 0; // Reset number of key presses
}
数学
在循环中,我们检查非数字输入并重置numKeyPresses变量if检测。进行转换的部分是:angle + = angleMultiplier *(key - 0x30)。当我们获得按键时,它将作为键映射2-diminsional数组中的字符返回。 key - 0x30以十六进制的形式减去30以获得它的数字等价物。
然后,我们必须将它乘以angleMultiplier。角度乘数从100开始。因此,例如,如果第一个数字输入为3,则添加到角度的数字将为300.然后将角度乘数除以10,以便下一次迭代,角度乘数将为10如果输入2,则将其乘以10并相加,得到320.这将一直持续到输入结束。
我写这个是可扩展的,允许扩展maxKeyPresses。 C ++的最大整数值是2147483647,所以使用这个程序,理论上你可以输入多达10位的输入,只要实际的密钥代码加起来不超过这个数。您总是可以使用 long 来存储输入,但出于我们的目的,没有必要。
应用数学
所以,现在我们我们(可能过于复杂)的计算,只需将其传递给伺服机构,将其定位到该特定角度。这里限制为180度的移动。如果数字输入超过180,则重置为180度并传递给伺服。这可能有多个应用程序,无论您是想在家中实现锁定系统,安全摄像机定位器,还是您需要的任何应用程序。
责任编辑:wv
全部0条评论
快来发表一下你的评论吧 !