拍电影

 找回密码
 注册

QQ登录

只需一步,快速开始

MOVCAM铁头官方网店
查看: 5149|回复: 0

[附件/套件] 无线Tally自己动手不求人(四)编程篇

[复制链接]
KZC 实名认证 二手区发帖许可证

57

主题

651

帖子

0

精华

认证会员

注册时间
2013-12-23
发表于 2017-7-1 09:25 | 显示全部楼层 |阅读模式
器材帖
内容来源: 原创(楼主原创内容)
器材帖类别: 器材经验分享
器材型号: 松下 HS-410
本帖最后由 KZC 于 2017-7-1 09:28 编辑

很多朋友一听到编程就非常头疼,觉得非常高深非常复杂,无法下手。实际上无论是硬件还是编程都和堆积木非常类似。只要明确了各个部分的功能和参数的意义,实现类似于Tally这种简单的功能还是非常轻松的。那么今天就将无线Tally的代码分享给大家。

出于最简单最容易理解的角度,我没有使用复杂点编码方式,而是直接以1字节表示一个Led的亮暗。比如8讯双色Tally我们就需要16字节来表示16个Led的亮暗信息。

那么先从主控端开始,为了简洁,在主控端我只写出了3讯双色Tally的代码。(所有//后和/* */之间的的都是注释)



int tally1=1;
int tally2=2;
int tally3=3;
int tally4=4;
int tally5=5;
int tally6=6;
//设置tally对应的模拟输入引脚号,如果有需要更多的led,则可以依次增加。
int t1=0;
int t2=0;
int t3=0;
int t4=0;
int t5=0;
int t6=0;
//初始化模拟输入读取的存储,如果有需要更多的led,则可以依次增加。
byte Tally[7]={};
/*初始化实际发送的一维字节数组。[]内的数值为实际Led数量+1。在这里我们有6个LED那么[]内数值即为6+1=7。*/
void setup() {
  Serial1.begin(9600);
}
//初始化串口 9600为波特率。我们需要保证主控端和终端的波特率一致。

void loop()
//循环体 会在经过setup初始化后持续循环执行
{
  t1 = analogRead(tally1);
  t2 = analogRead(tally2);
  t3 = analogRead(tally3);
  t4 = analogRead(tally4);
  t5 = analogRead(tally5);
  t6 = analogRead(tally6);
//读取模拟输入的值并存储到之前初始化的int类型中
  Tally[0]=0;
  if(t1<912)
  {
    Tally[1]=1;
  }
  else
  {
    Tally[1]=0;
  }
  if(t2<912)
  {
    Tally[2]=1;
  }
  else
  {
    Tally[2]=0;
  }
  if(t3<912)
  {
    Tally[3]=1;
  }
  else
  {
    Tally[3]=0;
  }
  if(t4<912)
  {
    Tally[4]=1;
  }
  else
  {
    Tally[4]=0;
  }
  if(t5<912)
  {
    Tally[5]=1;
  }
  else
  {
    Tally[5]=0;
  }
  if(t6<912)
  {
    Tally[6]=1;
  }
  else
  {
    Tally[6]=0;
  }  
/*判断Tally信号的高低并写入编码后的数值到一维字节数组中。1即是亮,0即是灭。如果需要更多LED数量 即可将*/
/*
if(t6<912)
  {
    Tally[6]=1;
  }
  else
  {
    Tally[6]=0;
  }
*/
/*这一段复制,每一段代表一个LED灯。只需修改两个[]中的数字即可。(复制时不含/* */)*/
  Serial1.write(Tally,7);
/*将一维字节数组写入到串口中。最后的数字7需要与声明byte Tally的数值相同,等于Led数量+1.*/
  delay(30);
//延迟30毫秒 以避免持续写入造成错误。
}



以上即为我们主控端的程序代码。结构非常简单,也非常直观,如果需要更多的LED数量,则更改对应数值和复制对应模块即可。
那么终端的程序代码则更为简单。



int led_pin1 = 3;
int led_pin2 = 4;
//设置数字输出引脚序号。
byte Tally[7]={};
//[]中数字需要与主控端的保持一致
void setup() {
    Serial.begin(9600);
    pinMode(led_pin1,OUTPUT);
    pinMode(led_pin2,OUTPUT);
}
//设置数字引脚为输出。

void loop() {
  //循环体
  Serial.readBytes(Tally,7);
  //从串口中读取Tally数据。
  if(Tally[0]==0)
  {
     if(Tally[1]==1)
     {
        digitalWrite(led_pin1, HIGH);
     }
     else
     {
        digitalWrite(led_pin1, LOW);
     }
     if(Tally[2]==1)
     {
        digitalWrite(led_pin2, HIGH);
     }
     else
     {
        digitalWrite(led_pin2, LOW);
     }
    /*此处只针对两个LED进行操作,因为我们是使用双色Tally ,每个终端只控制两个LED的亮暗,那么如何区别不同讯道呢?我们依旧只需要更改[]中的数值,在这个例子中我们写出了第一讯,那么如果我们需要第二讯,则可以将1和2修改为3和4。第三讯则将1和2修改为5和6。之后以此类推即可。一开始的Tally[0]保持不变。*/
  }
}



以上即为我们需要的全部程序代码,稍有编程经验的人估计在一个小时内就能写出来,那么毫无编程经验的人,根据说明,也可以经过修改对应数值和模块就能实现所需要的功能。

最简单的两讯道的系统全部部件和连线。左侧为主控端 右侧为两个终端。
微信图片_20170627190158.jpg
一个三讯系统所需要的器件。

以上即为我们无线Tally的全部内容了,希望能够对各位有所帮助。如果有其他想自己动手做的影视设备,欢迎在下方评论和给我留言。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

filmaker.cn

GMT+8, 2024-11-22 15:28

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表