求大神指导,arduino模拟引脚能当数字引脚用么
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求大神指导,arduino模拟引脚能当数字引脚用么相关的知识,希望对你有一定的参考价值。
参考技术A 如果你使用arduino IDE来开发程序,那么A0-A5接口不可以简单的当数字接口使用。即便你想使用A0-A5当作数字接口来使用,那么编程上需要一定的修改。其实,当不当作数字接口用,取决于你编程的时候,读入和输出的依据是什么。如果你按照高低电平的方式读入或输出,A0-A5就等于是数字接口了。
当然,你必须先了解以下内容:
1、TTL电平:高电平>2.4V,低电平<0.4V。一般输出高电平是3.5V,输出低电平是0.2V。
2、CMOS电平:1逻辑电平电压接近于电源电压,0逻辑电平接近于0V。本回答被提问者采纳 参考技术B 可以的,编号从A0——A5或是14——19(UNO),和数字脚一样的用法。
使用 I2C 从 arduino 上的模拟引脚读取值并将其发送到树莓派。它返回奇怪的数字,如 122 或 255
【中文标题】使用 I2C 从 arduino 上的模拟引脚读取值并将其发送到树莓派。它返回奇怪的数字,如 122 或 255【英文标题】:Using I2C to read value from analog pin on arduino and sending it to raspberry pi. It returns weird numbers like 122 or 255 【发布时间】:2014-03-02 22:34:16 【问题描述】:设置:
主设备:Raspberry Pi Model B REV_2
从设备:Arduino Uno REV_3
问题:
每当我在命令行中输入“r”时,它都会返回一个完全不应该的数字。例如,当我将跳线连接到最高 5V 的模拟引脚 A0 并在命令行上按“r”时,它应该返回 5 伏。嗯,它返回 255。当我将跳线连接到 3.3V 引脚时,它返回 169。
注意:
编写此代码的人确实注意到了一些我认为可能与此问题相关的内容。他的话如下......
“然后,Arduino 中的 setup 函数设置了两个将使用的回调函数。函数 processMessage 将在 on Receive 事件发生时被调用。这将是每当从 Raspberry Pi 发送命令时。另一个回调函数, sendAnalogReading, 与 onRequest 事件相关联。当 Raspberry Pi 请求数据并读取模拟值除以 4 以使其适合单个字节,然后将其发送回 Raspberry Pi 时,就会发生这种情况。”
我不知道他将值除以使其适合单个字节是什么意思。这就是为什么我会得到奇怪的数字吗?有人可以解释一下吗。
只是为了让这个线程更清楚,这里是我的设置和发出多个命令时显示的输出。
sudo python ardu_pi_i2c.py //运行我的程序
第一种情况,我将跳线从引脚 A0 连接到 arduino 上的 GRD。然后我选择了“r”选项,它给了我“0”
第二种情况,我将跳线从 arduino 上的引脚 A0 连接到 5V。然后我选择“r”,它给了我“255”
第三种情况我将跨接线从引脚 A0 连接到 3.3V。它给了我 171。
第四种情况,我将跨接线从引脚 A0 连接到 LED 的负极,它给了我“0”
第五种情况,我将跳线从引脚 A0 连接到 LED 的正极,它给了我“105”。
由于第一个和第四个场景似乎很顺利,我很好奇为什么其他数字会偏离,以及它们是否对它们有一些实际意义。
伪代码:
//Creates instance of SMBus called bus
//Prompts user for command "l" (toggles led) or "r" (reads from Analog pin 0)
//if command is l it writes it to arduino and causes onReceive handler(processmessage)
//if command is r then request_reading function will be called
//this will call read_byte in SMBus library that causes the on Request event to be invoked.
Python 程序
import smbus
import time
bus = smbus.SMBus(1)
SLAVE_ADDRESS = 0x04
def request_reading():
reading = int(bus.read_byte(SLAVE_ADDRESS))
print(reading)
while True:
command = raw_input("Enter command: l - toggle LED, r - read A0 ")
if command == 'l' :
bus.write_byte(SLAVE_ADDRESS, ord('l'))
elif command == 'r' :
request_reading()
ARDUINO 程序
#include <Wire.h>
int SLAVE_ADDRESS = 0x04;
int ledPin = 13;
int analogPin = A0;
boolean ledOn = false;
void setup()
pinMode(ledPin, OUTPUT);
Wire.begin(SLAVE_ADDRESS);
Wire.onReceive(processMessage);
Wire.onRequest(sendAnalogReading);
Serial.begin(9600);
void loop()
void processMessage(int n)
Serial.println("In processMessage");
char ch = Wire.read();
if (ch == 'l')
toggleLED();
void toggleLED()
ledOn = ! ledOn;
digitalWrite(ledPin, ledOn);
void sendAnalogReading()
Serial.println("In sendAnalogReading");
int reading = analogRead(analogPin);
Wire.write(reading >> 2);
【问题讨论】:
【参考方案1】:我相信输出是一个 0 - 255 范围内的数字(所有值都适合一个字节),对应于 0 - 5 伏的范围。因此,为了将读取的数字转换为电压,您可以这样做
voltage = number * 5.0 / 255.
你会发现对于number = 255
,你会得到voltage = 5.0
;
对于number = 171
,你会得到voltage = 3.35
对我来说听起来不错。这意味着 LED +ve 侧的电压为
105 * 5.0 / 255 = 2.05 V
这不是一个疯狂的价值。
【讨论】:
以上是关于求大神指导,arduino模拟引脚能当数字引脚用么的主要内容,如果未能解决你的问题,请参考以下文章