摇杆控制三色灯颜色

这篇博客介绍了如何通过采集摇杆的AD值和滑动电阻来实现RGB颜色的调节。它首先将直角坐标系的(x, y, z)转换为极坐标系,并映射到HSV颜色空间,然后将HSV转换为RGB值。代码示例展示了输入参数范围在[0,100]时,如何得到[0,255]范围的RGB值。

 大概思路:采集摇杆AD值后得到直径为d的圆内的点在直角坐标系下的坐标x,y。需要调节亮度需要另外一路滑动电阻z。

直角坐标系x,y,z转极坐标系,极坐标系极径对应HSV颜色空间的S,极角对应HSV颜色空间H,直角坐标系z对应HSV颜色空间V。HSV转RGB得到RGB值。代码如下,输入x,y,z 取值范围[0, 100],得到R,G,B值取值范围[0, 255]。代码如下:



#include "stdio.h"
#include "stdint.h"
#include "stdlib.h"
#include "math.h"


void HSVtoRGB(uint8_t *r, uint8_t *g, uint8_t *b, uint16_t h, uint16_t s, uint16_t v)
{
    // R,G,B from 0-255, H from 0-360, S,V from 0-100
    int i;
    float RGB_min, RGB_max;
    RGB_max = v*2.55f;
    RGB_min = RGB_max*(100 - s) / 100.0f;


    i = h / 60;
    int difs = h % 60; // factorial part of h


                       // RGB adjustment amount by hue
    float RGB_Adj = (RGB_max - RGB_min)*difs / 60.0f;


    switch (i) {
    case 0:
        *r = RGB_max;
        *g = RGB_min + RGB_Adj;
        *b = RGB_min;
        break;
    case 1:
        *r = RGB_max - RGB_Adj;
        *g = RGB_max;
        *b = RGB_min;
        break;
    case 2:
        *r = RGB_min;
        *g = RGB_max;
        *b = RGB_min + RGB_Adj;
        break;
    case 3:
        *r = RGB_min;
        *g = RGB_max - RGB_Adj;
        *b = RGB_max;
        break;
    case 4:
        *r = RGB_min + RGB_Adj;
        *g = RGB_min;
        *b = RGB_max;
        break;
    default:        // case 5:
        *r = RGB_max;
        *g = RGB_min;
        *b = RGB_max - RGB_Adj;
        break;
    }
}

//直角坐标系转极坐标系,极坐标系对应HSV,h=角度,s=长度,HSV转RGB
int main(int argc, char *argv[]){
    uint8_t r=0, g=0, b=0;
    uint8_t h = 0;
    uint8_t s = 0;
    uint8_t v = 0;


    int8_t x=atoi(argv[1]), y=atoi(argv[2]), z=atoi(argv[3]);  //x,y,z [0, 100]
    s = sqrt(x*x + y*y);  
    if(s == 0){
        h = 0;
    }else{
        h = (180/(4*atan(1))) * atan2(y, x);
    }
    v = z;


    HSVtoRGB(&r, &g, &b, h, s, v);
    printf("h=%d, s=%d, v=%d, r=%d, g=%d, b=%d\n", h, s, v, r, g, b);


    return 0;
}

 

虽然参考引用中未直接提及游戏摇杆控制LED的相关内容,但可以结合已知原理来推导实现方法和技术方案。 游戏摇杆本质通常是由X轴和Y轴的两个电位器组成,在摇杆运动时,能输出对应轴上的电压值。要实现用游戏摇杆控制LED,可利用单片机来处理摇杆输出的模拟信号,并根据信号状态控制LED的亮灭、亮度或颜色等。 ### 硬件连接 以PS2游戏双轴摇杆传感器模块和Arduino UNO为例,PS2游戏双轴摇杆传感器模块有2轴 (X,Y)模拟输出和1路 (Z)按钮数字输出。将摇杆的X轴、Y轴模拟输出引脚分别连接到Arduino UNO的模拟输入引脚(如A0、A1),Z轴按钮数字输出引脚连接到数字输入引脚(如D2),LED连接到Arduino UNO的数字输出引脚(如D3)[^1]。 ### 软件实现 通过Arduino IDE编写代码,利用单片机的ADC功能读取摇杆的模拟信号。以下是一个简单的示例代码: ```cpp // 定义摇杆引脚 const int xPin = A0; const int yPin = A1; const int zPin = 2; // 定义LED引脚 const int ledPin = 3; void setup() { // 初始化串口通信 Serial.begin(9600); // 设置LED引脚为输出模式 pinMode(ledPin, OUTPUT); } void loop() { // 读取摇杆X轴和Y轴的值 int xValue = analogRead(xPin); int yValue = analogRead(yPin); // 读取摇杆Z轴按键状态 int zValue = digitalRead(zPin); // 根据摇杆状态控制LED if (xValue > 512) { digitalWrite(ledPin, HIGH); // 当X轴值大于512时,LED亮 } else { digitalWrite(ledPin, LOW); // 否则,LED灭 } // 打印摇杆值到串口监视器 Serial.print("X: "); Serial.print(xValue); Serial.print(" Y: "); Serial.print(yValue); Serial.print(" Z: "); Serial.println(zValue); // 延时一段时间 delay(100); } ``` 上述代码实现了根据摇杆X轴的值控制LED的亮灭。当摇杆在X轴上向右推动,X轴值大于512时,LED亮起;否则,LED熄灭。 ### 扩展功能 可以根据需求进一步扩展功能,如根据摇杆Y轴的值控制LED的亮度,或者根据Z轴按键的状态控制LED的闪烁等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值