-
Notifications
You must be signed in to change notification settings - Fork 3
/
RicheBeta.ino
99 lines (79 loc) · 2.72 KB
/
RicheBeta.ino
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
///////Beta version of motor controller code, released 09/04/16/////////
///////Author: Fergus Riche, fr293@cam.ac.uk////////////////////////////
// QueueArray creates a FIFO queue, StepperF is my modified version of the
//bundled stepper library that deals with half stepping and turns off all
//phases when motor is not moving to save power, WireS is the i2c library
//for the attiny 841
#include <QueueArray.h> //http://playground.arduino.cc/Code/QueueArray
#include <StepperF.h>
#include <WireS.h> //https://github.com/orangkucing/WireS
// led is an indicator led attached to physical pin 2 of the attiny 841 SOIC
//define your own slave address for each motor axis with I2C_SLAVE_ADDR
//the motor has 2048 full steps per revolution; i.e. 4096 half steps
#define led 0
#define act 1
#define I2C_SLAVE_ADDR 24
#define STEPS 4096
// create a queue of ints to act as the command buffer
// create a stepper attached to physical pins 10, 11, 12, 13
QueueArray <int> buffer;
Stepper stepper(STEPS, 7, 8, 9, 10);
//create variables for the current task, and for any values recieved over
//i2c
int currenttask = 0;
int receivedValue = 0;
// enable the led as an output, blink it at startup to show that everything
//is ok
//begin the i2c communication and define the action to be performed on
// reciept of data as an interupt routine
//set the speed of the stepper in rpm
void setup()
{
pinMode(led,OUTPUT);
pinMode(act,OUTPUT);
Blink(led);
Wire.begin(I2C_SLAVE_ADDR);
Wire.onReceive(transfer);
stepper.setSpeed(10);
}
// the loop runs ad infinitum and checks the status of the buffer
//if it contains commands, take the first one out of the queue and make it
//the current task for the stepper and turn the activity light on
//if not, just turn the activity light off
void loop()
{
if (!buffer.isEmpty())
{
currenttask = buffer.dequeue();
digitalWrite(act,HIGH);
stepper.step(currenttask);
}
else
{
digitalWrite(act,LOW);
}
}
// this function is called as an interrupt on reciept of a correct address
//byte on the i2c line
// bytes arriving in twos are converted into signed 16 bit ints and added
//to the queue, the check is there to prevent misalignment of bytes as a
//result of a misread
void transfer(size_t c)
{
if (Wire.available() == 2)
{
int receivedValue = Wire.read() << 8 | Wire.read();
buffer.enqueue(receivedValue);
}
}
// this function is there to make blinking a pin easier for debug purposes
//it contains delays, and cannot be used inside any other interrupts
void Blink(int pin)
{
for(int i = 0; i <3; i++){
digitalWrite(pin,HIGH);
delay (100);
digitalWrite(pin,LOW);
delay (100);
}
}