1
0
mirror of https://github.com/2martens/uni.git synced 2026-05-07 03:46:25 +02:00

Merge branch 'master' of github.com:frmwrk123/uni

This commit is contained in:
2015-06-25 11:27:48 +02:00
3 changed files with 294 additions and 15 deletions

View File

@ -5,7 +5,6 @@
// hardware pins // hardware pins
int ledPin = 13; int ledPin = 13;
int analogLevel = 0; int analogLevel = 0;
int slaveAddress = 4; int slaveAddress = 4;
/** /**
@ -14,12 +13,18 @@ int slaveAddress = 4;
void setup() { void setup() {
// Configure pins // Configure pins
Wire.begin(); Wire.begin();
Wire.onReceive(receiveEvent); pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
// initialize serial port // initialize serial port
Serial.begin(9600); Serial.begin(9600);
} }
void writeResult(bool result)
{
Serial.print("Result: ");
Serial.println(result ? "on" : "off");
}
/** /**
* Loop function for main code * Loop function for main code
*/ */
@ -28,23 +33,21 @@ void loop() {
Wire.write(1); Wire.write(1);
Wire.endTransmission(); Wire.endTransmission();
delay(100); delay(100);
Wire.beginTransmission(slaveAddress); Wire.requestFrom(slaveAddress, 1);
Wire.write('r'); if (Wire.available()) {
Wire.endTransmission(); int x = Wire.read();
writeResult((bool) x);
}
delay(1900); delay(1900);
Wire.beginTransmission(slaveAddress); Wire.beginTransmission(slaveAddress);
Wire.write(0); Wire.write(0);
Wire.endTransmission(); Wire.endTransmission();
delay(100); delay(100);
Wire.beginTransmission(slaveAddress); Wire.requestFrom(slaveAddress, 1);
Wire.write('r'); if (Wire.available()) {
Wire.endTransmission(); int x = Wire.read();
writeResult((bool) x);
}
delay(1900); delay(1900);
} }
void receiveEvent(int readBytes)
{
int x = Wire.read();
Serial.print("Result: ");
Serial.println(x ? "on" : "off");
}

View File

@ -0,0 +1,150 @@
#include <Servo.h>
#include <Wire.h>
// these variables describe the used hardware pins
// adjust them when you use other pins
// hardware pins
int az = 50;
int xout = A4;
int zout = A2;
int vref = A3;
int ledPin = 13;
int slaveAddress = 4;
// servo
Servo ourServo;
int servoPin = 11;
// used to achieve a 10 Hz frequency
// don't touch them
long rc = 1049999;
// flags for servo
bool volatile cwMaxReached = false;
bool volatile ccwMaxReached = false;
bool volatile lightLED = false;
bool volatile read_ready = false;
// tmp variables
int volatile zAxis = 0;
int volatile ref = 0;
double volatile differenceZRef = 0;
double volatile rotationZ = 0;
int volatile currentServoPos = 0;
int volatile newServoPos = 0;
/**
* Calculates the servo position.
*
* @param int currentServoPos
* @param int rotationZ
*/
int calculate_new_servo_pos(int currentServoPos, int rotationZ) {
int newServoPos = currentServoPos + rotationZ;
// faktor 10 zu gross (weil messung grad/sec
if (newServoPos > 159) {
newServoPos = 159;
cwMaxReached = true;
lightLED = true;
}
if (newServoPos < 25) {
newServoPos = 25;
ccwMaxReached = true;
lightLED = true;
}
return newServoPos;
}
/**
* Setup function for initial setup code
*/
void setup() {
Wire.begin();
pmc_set_writeprotect(false);
pmc_enable_periph_clk(ID_TC1);
// configure hardware timer
TC_Configure(TC0, 1, TC_CMR_WAVE | TC_CMR_WAVSEL_UP_RC | TC_CMR_TCCLKS_TIMER_CLOCK2) ;
TC_SetRC(TC0, 1, rc);
TC0->TC_CHANNEL[1].TC_IER = TC_IER_CPCS; // IER = interrupt enable register
TC0->TC_CHANNEL[1].TC_IDR = ~TC_IER_CPCS;
NVIC_ClearPendingIRQ(TC1_IRQn);
NVIC_EnableIRQ(TC1_IRQn);
// start hardware timer
TC_Start(TC0, 1);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
ourServo.attach(servoPin);
ourServo.write(90);
// initialize serial port
Serial.begin(9600);
}
/**
* Loop function for main code
*/
void loop() {
if (read_ready) {
// berechnung auf 5000/1024 umstellen - was hat volt mit der berechnung zu tun? warscheinlich steht das so im aufgabenblatt ?
Serial.print("rotationZ: ");
Serial.println(rotationZ);
Serial.print("currentServoPos: ");
Serial.println(currentServoPos);
Serial.print("newServoPos: ");
Serial.println(newServoPos);
/*
if (lightLED) {
blink();
}*/
ourServo.write(newServoPos + 1);
read_ready = false;
}
}
/**
* Used to handle the timer.
*/
void TC1_Handler()
{
// request static for some magic behind the curtain
TC_GetStatus(TC0, 1);
read_ready = true;
requestValues();
//zAxis = analogRead(zout);
//ref = analogRead(vref);
//differenceZRef = zAxis - ref;
differenceZRef = (differenceZRef * 5000) / 1024;
rotationZ = (differenceZRef / 9.1);
if (fabs(rotationZ) > 4) {
currentServoPos = ourServo.read();
newServoPos = calculate_new_servo_pos(currentServoPos, rotationZ / 10);
}
}
void requestValues()
{
// request zAxis
Wire.requestFrom(slaveAddress, 4);
int result = 0;
int i = 1;
while (Wire.available()) {
uint8_t x = (uint8_t) Wire.read();
result = result | ((x) << ((sizeof(int) - i)*8));
i++;
}
differenceZRef = (double) result;
Serial.print("Got: ");
Serial.println(result);
}
void blink(){
digitalWrite(ledPin, HIGH);
delay(10);
digitalWrite(ledPin, LOW);
delay(10);
digitalWrite(ledPin, HIGH);
delay(10);
digitalWrite(ledPin, LOW);
delay(10);
digitalWrite(ledPin, HIGH);
delay(10);
digitalWrite(ledPin, LOW);
lightLED = false;
}

View File

@ -0,0 +1,126 @@
#include <SPI.h>
// pins
int slaveSelectPin = 10;
int rstPin = 6;
int dcPin = 5;
// constants
int divider = 84;
int maxBufferIndex = 288;
// buffer
char screenBuffer[288];
void setup()
{
Serial.begin(9600);
// intialize SPI
SPI.begin(slaveSelectPin);
SPI.setClockDivider(slaveSelectPin, divider);
// initialize pins
pinMode(dcPin, OUTPUT);
pinMode(rstPin, OUTPUT);
// initial reset of display
resetDisplay();
// initialization of display
digitalWrite(dcPin, LOW);
SPI.transfer(slaveSelectPin, 0x21);
SPI.transfer(slaveSelectPin, 0x14);
SPI.transfer(slaveSelectPin, 0xb0);
SPI.transfer(slaveSelectPin, 0x20);
SPI.transfer(slaveSelectPin, 0x0c);
digitalWrite(dcPin, HIGH);
// initialize screen buffer
for (int i = 0; i < maxBufferIndex; i++) {
screenBuffer[i] = 0x0;
}
}
/**
* Loop function for main code
*/
void loop()
{
for (int y = 0; y < 84; y++) {
for (int x = 0; x < 48; x++) {
setPixel(x, y, 1);
}
flushBuffer();
delay(20);
}
//flushBuffer();
//delay(20);
Serial.println("fertig");
}
void resetDisplay()
{
digitalWrite(rstPin, LOW);
delay(500);
digitalWrite(rstPin, HIGH);
}
void flushBuffer()
{
for (int i = 0; i < maxBufferIndex; i++) {
SPI.transfer(slaveSelectPin, screenBuffer[i]);
}
}
/**
* Sets the pixel at the given location.
* @param x
* @param y
* @param value
*/
void setPixel(int x, int y, int value)
{
int bank = x / 8;
int relativeRow = x - bank * 8;
int bankStartIndex = bank * 48;
int index = bankStartIndex + y;
char bitValue = 0x0;
if (value == 1) {
bitValue = 0xff;
}
char existingValue = screenBuffer[index];
char pixelMask = 1 << relativeRow;
pixelMask = 0x0 | pixelMask;
char invMask = ~ pixelMask;
char newValue = pixelMask & bitValue;
char finalExistingValue = existingValue & invMask;
char finalValue = finalExistingValue | newValue;
Serial.print("bank:");
Serial.println(bank);
Serial.print("relRow:");
Serial.println(relativeRow);
Serial.print("index:");
Serial.println(index);
Serial.print("value:");
Serial.println(value);
Serial.print("existingValue:");
Serial.println(existingValue, BIN);
Serial.print("finalExistingValue:");
Serial.println(finalExistingValue, BIN);
Serial.print("pixelMask:");
Serial.println(pixelMask, BIN);
Serial.print("invMask:");
Serial.println(invMask, BIN);
Serial.print("newValue:");
Serial.println(newValue, BIN);
Serial.print("finalValue:");
Serial.println(finalValue, BIN);
Serial.println("-----");
screenBuffer[index] = finalValue;
}