Беспроводное управление фокусом кинообъектива! Проблема.
- Войдите на сайт для отправки комментариев
Пт, 20/02/2015 - 19:17
Привет всем! Собрал готовый проект по управлению фокусировкой объектива!
В проекте используется moteino r4 с транссиверами rfm69hw на частоте 433mhz


Как я полагаю проблема заключается в том что не устанавливается связь между радиомодулями!
Т.к проверка с тестовым кодом показывает что радиомодули рабочие и связь есть!
Так же проверка с тестовым кодом показывает что moteino оптический энкодер шд и драйвер рабочие.
Остается разобраться в коде. Буду очень признателен за помощь! С предложениями и условиями shahf2d@mail.ru
Прилагаю код проекта!
///////////////////////
//Moteino FF Sender //
///////////////////////
#include <SPI.h>
#include <RFM69.h>
#include <avr/sleep.h>
#include <OneButton.h>
// You will need to initialize the radio by telling it what ID it has and what network it's on
// The NodeID takes values from 1-127, 0 is reserved for sending broadcast messages (send to all nodes)
// The Network ID takes values from 0-255
// By default the SPI-SS line used is D10 on Atmega328. You can change it by calling .SetCS(pin) where pin can be {8,9,10}
#define NODEID 15 //network ID used for this unit
#define NETWORKID 99 //the network ID we are on
#define GATEWAYID 16 //the node ID we're sending to
//#define ACK_TIME 50 // # of ms to wait for an ack
//int interPacketDelay = 1000; //wait this many ms between sending packets
char input = 0;
int data = 0;
// Need an instance of the Radio Module
RFM69 radio;
byte sendSize=0;
char payload[] = "1234567890:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ";
bool requestACK=false;
// Setup OneButton
OneButton playButton (A1, true);
OneButton outButton (A2, true);
OneButton inButton (A3, true);
OneButton realTimebutton(A4, true);
//LEDs
#define playLED 5 //PLay LED
#define outLED 6 //Out LED
#define inLED 7 //In LED
#define realTimeLED 8 //Real Time LED
//Values for focus points
volatile int inPoint = 0;
volatile int outPoint = 3000;
//Blink without delay
boolean ledState = LOW;
long previousMillis = 0;
int ledInterval = 75;
//Defining booleans
boolean rClickedOnce = false;
boolean rLongPress = false;
boolean pClickedOnce = false;
boolean highEndMark = false;
boolean lowEndMark = false;
//Value to recieve from 2nd Xbee: when "play" or "rewind" has finished"
int sum;
int a;
//Modes
int mode;
#define Stop 1
#define LENSCALIB 2
int encoder0PinA = 4;
int encoder0PinB = 3;
int encoderValue = 0;
int encoder0PinALast = LOW;
int n = LOW;
void setup() {
pinMode (encoder0PinA,INPUT);
pinMode (encoder0PinB,INPUT);
pinMode (realTimeLED, OUTPUT);
pinMode (playLED, OUTPUT);
pinMode (inLED, OUTPUT);
pinMode (outLED, OUTPUT);
radio.initialize(NODEID, RF69_433MHZ, NETWORKID);
radio.sleep(); //sleep right away to save power
//Attach Click to Buttons
realTimebutton.attachClick(Click);
playButton.attachClick(ClickPlay);
inButton.attachClick(ClickIn);
outButton.attachClick(ClickOut);
//Attach Press to Real Time for calibrating lens and motor
realTimebutton.attachPress(rPress);
//Start Up Light
for (int x=0;x<3;x++)
{
for (int l=5;l<9;l++)
{
digitalWrite(l,HIGH);
delay (100);
digitalWrite(l,LOW);
delay (100);
}
}
}
void loop() {
n = digitalRead(encoder0PinA);
if ((encoder0PinALast == LOW) && (n == HIGH)) {
if (digitalRead(encoder0PinB) == LOW) {
encoderValue--;
Transmit(1);
}
else {
encoderValue++;
Transmit(2);
}
}
encoder0PinALast = n;
// keep watching the push buttons:
realTimebutton.tick();
playButton.tick();
inButton.tick();
outButton.tick();
// filter signal from stepper motor
//arduino when(play/rewind/In/Out) is done.
if (radio.receiveDone())
{
{
sum = 0;
for (byte i = 0; i < radio.DATALEN; i++)
{
a = (radio.DATA[i]);
}
sum+=a;
dataSort ();
}
}
switch (mode)
{
case LENSCALIB:
{
blinkFunction (realTimeLED);
if (lowEndMark == true && highEndMark == true ||rClickedOnce == true || pClickedOnce == true)
{
rLongPress = false;
digitalWrite (realTimeLED, LOW);
if (rClickedOnce == true)
digitalWrite(realTimeLED, HIGH);
if (pClickedOnce == true)
digitalWrite (playLED, HIGH);
mode = Stop;
break;
}
}
}
}
//4 Buttons Click Functions
//Real Time Switch
void Click() {
digitalWrite(playLED, LOW);
rLongPress = false;
if (rClickedOnce == false )
{
rClickedOnce = true;
digitalWrite(realTimeLED, HIGH);
Transmit(3);
}
else
{
digitalWrite(realTimeLED, LOW);
rClickedOnce = false;
}
}
// Press Function - calibrating lens and stepper
void rPress() {
if (rLongPress == false) {
rLongPress = true;
rClickedOnce = false;
highEndMark = false;
lowEndMark = false;
Transmit(4);
mode = LENSCALIB;
}
else
{
rLongPress = false;
digitalWrite(realTimeLED, LOW);
mode = Stop;
}
}
//Play Switch
void ClickPlay () {
//terminate realtime in case it wasn't stopped
if (pClickedOnce == false)
{
pClickedOnce = true;
rClickedOnce = false;
digitalWrite(realTimeLED, LOW);
digitalWrite(playLED, HIGH);
radio.send(GATEWAYID, payload, sendSize+(5));
radio.sleep();
}
else
{
pClickedOnce = false;
digitalWrite(playLED, LOW);
}
}
//In Switch
void ClickIn () {
// Saving In
if (rClickedOnce == true)
{
inPoint = encoderValue;
Transmit(6);
}
else if (rLongPress == true)
{
lowEndMark = true;
Transmit(8);
}
}
//Out Switch
void ClickOut() {
//Saving Out
if (rClickedOnce == true)
{
Transmit(7);
outPoint = encoderValue;
}
else if (rLongPress == true)
{
highEndMark = true;
Transmit(9);
}
}
int blinkFunction (int y) // Blink without delay
{
unsigned long currentMillis = millis ();
if (currentMillis - previousMillis>ledInterval)
{
previousMillis = currentMillis;
if (ledState == LOW)
ledState = HIGH;
else
ledState = LOW;
digitalWrite (y, ledState);
}
}
int blinkMark (int y)
{
boolean b = HIGH;
for (int i=0;i<6;i++)
{
digitalWrite(y, b);
delay(75);
b=!b;
}
}
int Transmit (int data)
{
//1.Send encoder value to move stepper
if (rClickedOnce == true||rLongPress == true)
{
radio.send(GATEWAYID, payload, sendSize+(data));
radio.sleep();
}
else if (pClickedOnce == false)
{
//2. Send speed value to move stepper
radio.send(GATEWAYID, payload, sendSize+(data+10));
radio.sleep();
}
}
void dataSort ()
{
if (sum == 49)
blinkMark(inLED);
else if (sum == 50)
blinkMark (outLED);
else if (sum == 51)
{
pClickedOnce = false;
rClickedOnce = false;
digitalWrite (playLED, LOW);
}
}
////////////////////////
//Moteino FF Receiver///
////////////////////////
#include <SPI.h>
#include <RFM69.h>
#include <AccelStepper.h>
#include <avr/sleep.h>
#define FREQUENCY RF69_433MHZ
#define IS_RFM69HW
//encoder/motor/driver setup
int easyDriverMicroSteps = 1;
int rotaryEncoderSteps = 100;
int motorStepsPerRev = 200;
int MinPulseWidth = 50; //too low and the motor will stall, too high and it will slow it down
int easyDriverStepPin = 15;
int easyDriverDirPin = 16;
int enablePin = 17;
volatile long encoderValue = 0;
long lastencoderValue = 0;
//Values for focus points
int inPoint;
int outPoint;
//value for variable speed
int speedValue = 1000;
//Values for Lens Calibration
int lowEndMark = -50000;
int highEndMark = 50000;
boolean lowEndSwitch = false;
boolean highEndSwitch = false;
//ON LED
#define onLed 12
int mode;
#define Rewind 1
#define Play 2
// standBy mode is meant to enable changes in speed
#define standBy 3
#define realTime 4
#define Stop 5
#define LENSCALIB 6
AccelStepper stepper(1, easyDriverStepPin, easyDriverDirPin);
//Sleep Function - to disable ED when not active
long previousMillis = 0;
int sleepTimer = 5000;
// You will need to initialize the radio by telling it what ID it has and what network it's on
// The NodeID takes values from 1-127, 0 is reserved for sending broadcast messages (send to all nodes)
// The Network ID takes values from 0-255
// By default the SPI-SS line used is D10 on Atmega328. You can change it by calling .SetCS(pin) where pin can be {8,9,10}
#define NODEID 16 //network ID used for this unit
#define NETWORKID 99 //the network ID we are on
#define GATEWAYID 15 //the node ID we're sending to
#define SERIAL_BAUD 115200
//encryption is OPTIONAL
//to enable encryption you will need to:
// - provide a 16-byte encryption KEY (same on all nodes that talk encrypted)
// - to call .Encrypt(KEY) to start encrypting
// - to stop encrypting call .Encrypt(NULL)
uint8_t KEY[] = "ABCDABCDABCDABCD";
//int for incoming radio data
int a;
int sum;
//variables for outgoing radio data
char input = 0;
int data = 0;
// Need an instance of the Radio Module
RFM69 radio;
byte sendSize=0;
char payload[] = "1234567890:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ";
bool requestACK=false;
void setup()
{
radio.initialize(FREQUENCY, NODEID, NETWORKID);
//comment this out to disable encryption
stepper.setMinPulseWidth(MinPulseWidth);
stepper.setMaxSpeed(speedValue); //variable to later determine speed play/rewind
stepper.setAcceleration(100000);
stepper.setSpeed(50000);
pinMode(enablePin, OUTPUT);
}
void loop()
{
stepper.run();
if (radio.receiveDone())
{
lastencoderValue = encoderValue;
digitalWrite (enablePin, LOW);
previousMillis = millis();
sum = 0;
for (byte i = 0; i < radio.DATALEN; i++)
{
a = (radio.DATA[i]);
}
sum+=a;
dataSort ();
stepperMove();
}
else
{
//Stepper sleep after 5sec of no data
unsigned long currentMillis = millis ();
if (currentMillis - previousMillis>sleepTimer)
digitalWrite (enablePin, HIGH);
}
switch (mode)
{
case standBy:
break;
case Stop:
break;
case realTime:
dataSort();
stepperMove();
break;
case Rewind:
//take care of variable speed
stepper.setMaxSpeed(speedValue);
stepper.moveTo(inPoint);
stepper.run();
digitalWrite (enablePin, LOW);
if(stepper.currentPosition()==inPoint)
{
Transmit (3);
mode=standBy;
}
break;
case LENSCALIB:
highEndMark = 50000;
lowEndMark = -50000;
lowEndSwitch = false;
highEndSwitch = false;
mode = Stop;
break;
case Play:
//take care of variable speed
stepper.setMaxSpeed(speedValue);
stepper.moveTo(outPoint);
stepper.run();
digitalWrite (enablePin, LOW);
if(stepper.currentPosition()==outPoint)
{
Transmit (3);
mode=standBy;
}
break;
}
}
void dataSort()
{
if (sum == 54)
{
inPoint = stepper.currentPosition();
Transmit (1);
}
else if (sum == 55)
{
outPoint = stepper.currentPosition();
Transmit (2);
}
else if (sum == 49)
{
encoderValue++;
}
else if (sum == 50)
{
encoderValue--;
}
else if (sum == 56)
{
lowEndMark = stepper.currentPosition();
lowEndSwitch = true;
Transmit (1);
}
else if (sum == 57)
{
highEndMark = stepper.currentPosition();
highEndSwitch = true;
Transmit (2);
}
else if (sum == 52)
{
mode = LENSCALIB;
}
else if (sum == 51)
{
mode = Stop;
}
else if (sum == 53)
{
//function to make Play or Rewind
defineDirection();
}
else if (sum == 58)
{
speedValue -=30;
if (speedValue <100)
speedValue = 100;
}
else if (sum = 59)
{
speedValue+=30;
if (speedValue>5500)
speedValue = 6000;
}
}
void defineDirection()
{
if (stepper.currentPosition()!=inPoint)
{
mode = Rewind;
}
else if (stepper.currentPosition() == inPoint)
{
mode = Play;
}
}
void stepperMove ()
{
int stepsPerRotaryStep = (motorStepsPerRev * easyDriverMicroSteps) / rotaryEncoderSteps;
int motorMove = (encoderValue * stepsPerRotaryStep);
if (mode==standBy)return;
//Lens Calibration
if (motorMove >lowEndMark)
motorMove = lowEndMark;
if (motorMove<highEndMark)
motorMove = highEndMark;
stepper.run();
stepper.setMaxSpeed(1000);
stepper.moveTo(motorMove);
}
int Transmit (int data)
{
radio.send(GATEWAYID, payload, sendSize+(data));
radio.sleep();
}
Выручайте! Устройство очень нужно для съемок дипломного фильма!!!
Могу помочь. Пишите на почту
m_t01@mail.ru