MAKER:Niubit/译:趣无尽(转载请注明出处)
用 LDR 光敏电阻器和 RGB LED 自制一个简单的颜色传感器,然后再用 micro:bit 来搭建一个简易的彩色球分拣机。
颜色传感器工作原理
举个例子,在红色物体上施加红色的光反射出的光会比对同一个红色物体施加绿色或蓝色光具有更高的强度。
我们将光敏电阻器放在 LED 旁边,LED 将发出一系列的彩色脉冲。
通过读取光电阻器中获得的每种颜色脉冲的模拟值,再根据放在它前面的物体的颜色来感知差异,这就可以区分颜色。它的精确度还不是很准确,但通过不断的校准可以在许多情况下应用。
组件清单
LDR 光敏电阻器 GL5516 × 1
RGB LED 5mm × 1
100Ω 电阻器 × 3
10KΩ 电阻 × 1
1×06 引脚 × 1
1x6x8 板子 × 6
电路图
如图所示,传感器的简单电路。LED 对应到每种颜色的端子上的典型限流电阻器。LDR 光敏电阻器与 10KΩ 电阻器一起作用于分压器模式。
实际电路
如图所示,将条纹板中的 3 条进行切割。注意,如图所示板是在没有铜轨道的一侧,将在那里放置组件。切断处安装三个 100 欧姆电阻。
如图所示,对组件进行焊接。
最后得到 6 Pin 模块。
外壳
为了尽可能确保光敏电阻接收的光是来自传感器扫描物体所反射的光,而不是直接来自于 LED 的光,我们为这两个组件设计了一个外壳。
彩球分拣机
为了测试传感器的有效性,我们设计了一台简单的彩色球分拣机。该分拣机配有传感器、一对伺服和一个微钻头。分拣通道由一个带有伺服控制的分叉端的倾斜导轨组成。
颜色传感器会扫描彩球,机器就可以根据球的颜色做出判断。
伺服电机 1:将球停在机器入口轨道的起点,以便颜色传感器工作。它有两个位置,一个关门,一个开门。
伺服电机 2:将控制进入轨道末端的交叉处,使球被送到机器左侧或右侧出口的轨道。
我们用硬纸板做轨道,将 3D 打印部件与其相连,最后将定制的伺服臂安装上就完成了。
编程
我们将 micro:bit 作为微控制器,并通过一个断路器板与传感器和伺服器进行连接。接线方式如下:
| Device | Device pin | Color cable | micro:bit pin | |--------------|------------|-------------|---------------| | Color sensor | 1: B | Green | P8 | | Color sensor | 2: G | White | P2 | | Color sensor | 3: GND | Orange | GND | | Color sensor | 4: R | Blue | P1 | | Color sensor | 5: ADC | Red | P0 | | Color sensor | 6: +3,3V | Black | +3.3V | | Servo 1 | | | P14 | | Servo 2 | | | P13 |
完整源码如下,也可以在项目文件库下载:
https://make.quwj.com/project/444
from microbit import * # pin0 => LDR # pin1 => LED_R # pin2 => LED_G # pin8 => LED_B # pin14 => Servo 1 # pin13 => Servo 2 # Constants FILTER = [1, 3] # Balls that we want to send to the right (the rest will go to the left) CALIB_EMPTY = (234, 242, 244) CALIB_RED = (103, 250, 264) CALIB_YELLOW = (85, 177, 254) CALIB_BLUE = (244, 247, 251) CALIB = [CALIB_EMPTY, CALIB_RED, CALIB_YELLOW, CALIB_BLUE] ANG_FORK_LEFT = 53 ANG_FORK_RIGHT = 73 ANG_DOOR_OPEN = 70 ANG_DOOR_CLOSED = 100 # Functions def read_color(pin): pin.write_digital(1) sleep(100) reading = pin0.read_analog() pin.write_digital(0) return reading def scan_ball(): r = read_color(pin1) # Red pulse g = read_color(pin2) # Green pulse b = read_color(pin8) # Blue pulse return (r, g, b) def estimate_color(bola): min_distance = 1024 * 3 nearest_color = 0 for i in range(len(CALIB)): color_distance = abs(CALIB[i][0] - bola[0]) + abs(CALIB[i][1] - bola[1]) + abs(CALIB[i][2] - bola[2]) if color_distance < min_distance: min_distance = color_distance nearest_color = i return nearest_color # We make sure that the LEDs start up switched off pin1.write_digital(0) pin2.write_digital(0) pin8.write_digital(0) # We initialise the servos pin13.set_analog_period(20) # PWM pulse period (1/20ms = 50Hz) pin14.set_analog_period(20) pin13.write_analog(ANG_FORK_LEFT) # Initially we choose any side pin14.write_analog(ANG_DOOR_CLOSED) while True: ball_found = estimate_color(scan_ball()) if ball_found != 0: display.show(ball_found) if ball_found in FILTER: pin13.write_analog(ANG_FORK_RIGHT) else: pin13.write_analog(ANG_FORK_LEFT) sleep(500) pin14.write_analog(ANG_DOOR_OPEN) sleep(1000) pin14.write_analog(ANG_DOOR_CLOSED) sleep(3000) display.clear() sleep(3000)
分拣机的代码逻辑如下:
1、启动时机器入口关闭,由伺服电机 1 控制。
2、程序定期扫描来球的位置,并判断是否有球和球的颜色。
3、如果在入口端有一个球,伺服电机 2 用来控制分叉口根据我们想要的颜色将球发送到哪一边。等待半秒后,伺服 2 将定位自己。我们用伺服 1 打开门,门关闭前停留一秒,,然后一个新的球放到扫描位置。
4、如果发现没有球,将等待三秒,以便在两次扫描的间隔插入球(不要在扫描过程中插入彩球,这很可能导致颜色判断错误)。
为了让机器正常工作,以下需要校准:
1、颜色传感器为球的每种颜色读取的 RGB 值。
2、当入口端没有球时,传感器读取的 RGB 值。
3、调整伺服电机 1 开启和关闭门位置的角度。
4、调整伺服电机 2 左右拨位的角度。
对于颜色传感器的前两次校准,我们将发射三个 100ms 的纯彩色脉冲,并收集光电器将读取的三个值。每组值将识别一个特定的球的颜色或入口处没有球的情况。例如,与机器一起使用的三种球的颜色的校准,加上没有球的门的校准,结果是(每种颜色的三个校准值分别对应RGB LED 按红、绿、蓝灯打开时光电器返回的值):
CALIB_EMPTY = (234, 242, 244) CALIB_RED = (103, 250, 264) CALIB_YELLOW = (85, 177, 254) CALIB_BLUE = (244, 247, 251)
伺服电机 1 的合适值为:
Ang_door_open = 70 Ang_door_closed = 100
伺服电机 2 的合适值为:
Ang_fork_left = 53 Ang_fork_right = 73
根据这些值,我们编写了附加的程序。我们可以看到这台机器的工作原理,它将红色的球过滤到一边,其余的颜色则过滤到另一边。
通过最简单、基础的元器件实现有用的功能是非常奇妙的事情。
发表评论