【机智云Gokit3测评】+点亮一个RGB灯
本帖最后由 青春最好时 于 2021-1-21 21:18 编辑<p>怎么说呢,之前我没用过Arduino进行开发过项目,自己主要使用32和51多一点,昨天开箱以后就迫不及待的写了一个板子的开箱测评,今天从早上8点多捣鼓到下午快8点终于点亮了一个RGB灯,摸索了一天,发现Arduino进行开发程序和32以及51是有一定差别的,刚开始的时候发现Arduino没有main函数,只有setup()和loop()函数,发现setup()函数上电就只执行一次,loop()函数是重复执行的,相当于</p>
<p>void main()</p>
<p>{</p>
<p> setup(); //上电只执行一次</p>
<p> ...........</p>
<p> while(1)</p>
<p> {</p>
<p> loop(); //重复执行的</p>
<p> .............</p>
<p> } </p>
<p>}</p>
<p>要是初学Arduino,给大家推荐一个网站,Arduino中文社区:网站:<a href="https://www.arduino.cn/forum.php " target="_blank">https://www.arduino.cn</a></p>
<p>可以先了解一下Arduino的规范和库的使用。</p>
<p><strong>下面就开始今天正文部分</strong></p>
<p>点亮机智云板子上的一个RGB</p>
<p>先看原理图:底板对应接口:</p>
<p></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>因为 UNO R3 只有一个串口0 <span style="background-color:#2ecc71;">所以每次下载程序的时候需要把核心板拆下来,然后再用Arduino IDE下载程序,不然的话不能下载程序,下载的时候会报错</span>。所以这个板子每次下载程序都得先取下来,然后再把核心板插上去,多少有点不方便。</p>
<p>先看下驱动RGB灯珠的驱动芯片P9813:</p>
<p>芯片2脚是时钟信号,1脚是数据信号,时钟线拉高后变低,数据传输到芯片里面,详情可以参考一下CSDN的博客:<a href="https://blog.csdn.net/qq_40860986/article/details/83035912" target="_blank">https://blog.csdn.net/qq_40860986/article/details/83035912</a></p>
<p>其他就不多说了,下面看下驱动机智云RGB的代码:</p>
<hr />
<p>#define RGB_CLK_H; digitalWrite(SCL,HIGH); <br />
#define RGB_CLK_L; digitalWrite(SCL,LOW);</p>
<p>#define RGB_DATA_H; digitalWrite(SDA,HIGH);<br />
#define RGB_DATA_L; digitalWrite(SDA,LOW);<br />
u32 Color_Data(unsigned int r,unsigned int g,unsigned int b) //写入三个八位的值,返回一个32位的数值<br />
{ <br />
u32 temp=0;<br />
<br />
temp |=0x03<<30; //0xc0--> 1100 0000 1010 1010<br />
temp |= ((~b)&0xc0)<<22; //取蓝色最高两位取反,得到B7’ B6’<br />
temp |= ((~g)&0xc0) <<20; //取绿色最高两位取反,得到G7’G6’<br />
temp |= ((~r)&0xc0) <<18; //取绿色最高两位取反,得到R7’R6’<br />
temp |= b<<16;<br />
temp |= g<<8;<br />
temp |= r<<0;<br />
<br />
return temp;<br />
}<br />
void RGB_Send_Data(u32 data)<br />
{<br />
unsigned int i;<br />
for(i=0;i<32;i++)<br />
{<br />
//取data的最高位,如果是1就写1(注意按位操作是写16进制)<br />
if(data&0x80000000)//准备一位数据 <br />
{<br />
RGB_DATA_H;<br />
}<br />
else<br />
{<br />
RGB_DATA_L; //否则写0<br />
}<br />
data<<=1;//每取出一个数据,让次高位变成最高位,遍历整个32位的data值<br />
RGB_CLK_L;<br />
delay(1);<br />
RGB_CLK_H;<br />
delay(1);<br />
/*以上四步操作令CLK产生上升沿*/<br />
}<br />
}</p>
<p>void RGB_Color_Control(unsigned int r,unsigned int g,unsigned int b)<br />
{<br />
u32 color_data;<br />
color_data= Color_Data(r,g,b) ;<br />
<br />
RGB_Send_Data(0);//先发送32位低电平起始信号<br />
RGB_Send_Data(color_data); //发送第一个32位灰度数据<br />
RGB_Send_Data(color_data); //发送第二个32位灰度数据</p>
<p>}<br />
void setup() {<br />
// put your setup code here, to run once:<br />
pinMode(SDA,OUTPUT);<br />
pinMode(SCL,OUTPUT);<br />
}<br />
unsigned int RGB_Color_number = 0;<br />
void loop() {<br />
// put your main code here, to run repeatedly:<br />
RGB_Color_number++;<br />
if(RGB_Color_number >= 1000)RGB_Color_number = 0;<br />
RGB_Color_Control(RGB_Color_number,210,110);<br />
delay(100);<br />
RGB_Color_Control(0,RGB_Color_number,0);<br />
delay(100);<br />
}</p>
<hr />
<p>定义一个RGB变量RGB_Color_number 每个一段时间自加,然后写入RGB控制函数代码比较简单。</p>
<p>下面是代码文件,有兴趣的可以下载<br />
</p>
<p>效果如下图:</p>
<p></p>
<p>本人水平有限,有问题请谅解<img height="52" src="https://bbs.eeworld.com.cn/static/editor/plugins/hkemoji/sticker/facebook/pleased.gif" width="48" /></p>
<p>程序下载下来测试了一下,灯不亮啊0.0</p>
<p>过了好一会才亮0.0</p>
页:
[1]