Beispiel #1
0
/** Write a Gyroscope Register.
 * I2C should aready be initialized!
 *
 * \param reg Register Address
 * \param val New Value
 * \returns #TWI_NO_ANSWER, #TWI_WRITE_ERROR or #SUCCESS.
 */
Error gyroWriteByte(uint8_t reg, uint8_t val) {
    if (twiStart(GYRO_ADDRESS | TWI_WRITE)) {
        return TWI_NO_ANSWER;
    }
    if (twiWrite(reg)) {
        return TWI_WRITE_ERROR;
    }
    if (twiWrite(val)) {
        return TWI_WRITE_ERROR;
    }
    twiStop();
    return SUCCESS;
}
Beispiel #2
0
/** Write a Magnetometer Register.
 * I2C should aready be initialized!
 *
 * \param reg Register Address
 * \param val New Value
 * \returns #TWI_NO_ANSWER, #TWI_WRITE_ERROR or #SUCCESS.
 */
Error magWriteRegister(uint8_t reg, uint8_t val) {
    if (twiStart(MAG_ADDRESS | TWI_WRITE)) {
        return TWI_NO_ANSWER;
    }
    if (twiWrite(reg)) {
        return TWI_WRITE_ERROR;
    }
    if (twiWrite(val)) {
        return TWI_WRITE_ERROR;
    }
    twiStop();
    return SUCCESS;
}
// Set initial accelerometer parameters....modify as appropriate for your design.
void GadgetShield::accel_init(void)
{
  twiWrite("\x07\x00", 2); // Access mode register, place device in standby mode so we can modify other regs
  twiWrite(
      "\x05"       // Set address of sleep count register
      "\x00"       // Reset sleep count register to 0
      "\xE0"       // Enable shake interrupts (X/Y/Z)
      "\x00"       // Write 0 to mode register again, just so we don't start another write cycle
      "\x00"       // Reset all filtering, auto-wake averaging, and set 120 samples/s
      "\x00"       // Reset tap-pulse detection register to threshold of 1, all axes enabled for tap
      "\x60"       // Set tap-pulse debounce count register to 96 (seems to work well)
      , 7);

  twiWrite("\x07\x41", 2); // Enter active mode, set interrupt output to push-pull
}
Beispiel #4
0
void lcdPutString(char* data) {
	twiStartWait(LCD_ADDRESS+I2C_WRITE);
	while(*data != '\0') {
		lcdCharsSent++;
		if (*data != '\r') {
			if (*data == '\n') {
				twiWrite('\r');
				twiWrite('\n');
				data++;
			} else {
				twiWrite(*data++);
			}
		} else {
			data++;
		}
	}
	twiStop();
	if (lcdCharsSent >= CHARSTOSEND) {
		lcdCharsSent = 0;
		_delay_ms(TIMETOWAIT);
	}
}
Beispiel #5
0
Error gyroRead(Vector3f *v) {
    // Simple Software Low-Pass
    static double gyroSumX = 0, gyroSumY = 0, gyroSumZ = 0;
    static double gyroFilterX = 0, gyroFilterY = 0, gyroFilterZ = 0;

    if (v == NULL) {
        return ARGUMENT_ERROR;
    }
    if (twiStart(GYRO_ADDRESS | TWI_WRITE)) {
        return TWI_NO_ANSWER;
    }
    if (twiWrite(GYROREG_OUTXL | 0x80)) { // Auto Increment
        return TWI_WRITE_ERROR;
    }
    if (twiRepStart(GYRO_ADDRESS | TWI_READ)) {
        return TWI_NO_ANSWER;
    }

    uint8_t xl = twiReadAck();
    uint8_t xh = twiReadAck();
    uint8_t yl = twiReadAck();
    uint8_t yh = twiReadAck();
    uint8_t zl = twiReadAck();
    uint8_t zh = twiReadNak();

    int16_t x = *(int8_t *)(&xh);
    x *= (1 << 8);
    x |= xl;

    int16_t y = *(int8_t *)(&yh);
    y *= (1 << 8);
    y |= yl;

    int16_t z = *(int8_t *)(&zh);
    z *= (1 << 8);
    z |= zl;

    switch (gyroRange) {
        case r250DPS:
            v->x = (((double)x) * 250 / 0x8000);
            v->y = (((double)y) * 250 / 0x8000);
            v->z = (((double)z) * 250 / 0x8000);
            break;
        case r500DPS:
            v->x = (((double)x) * 500 / 0x8000);
            v->y = (((double)y) * 500 / 0x8000);
            v->z = (((double)z) * 500 / 0x8000);
            break;
        case r2000DPS:
            v->x = (((double)x) * 2000 / 0x8000);
            v->y = (((double)y) * 2000 / 0x8000);
            v->z = (((double)z) * 2000 / 0x8000);
            break;
        default:
            return ARGUMENT_ERROR;
    }

    gyroSumX = gyroSumX - gyroFilterX + v->x;
    gyroFilterX = gyroSumX / GYROFILTERFACTOR;
    v->x = gyroFilterX;

    gyroSumY = gyroSumY - gyroFilterY + v->y;
    gyroFilterY = gyroSumY / GYROFILTERFACTOR;
    v->y = gyroFilterY;

    gyroSumZ = gyroSumZ - gyroFilterZ + v->z;
    gyroFilterZ = gyroSumZ / GYROFILTERFACTOR;
    v->z = gyroFilterZ;

    return SUCCESS;
}
Beispiel #6
0
Error magRead(Vector3f *v) {
    if (v == NULL) {
        return ARGUMENT_ERROR;
    }
    if (twiStart(MAG_ADDRESS | TWI_WRITE)) {
        return TWI_NO_ANSWER;
    }
    if (twiWrite(MAGREG_XH)) {
        return TWI_WRITE_ERROR;
    }
    if (twiRepStart(MAG_ADDRESS | TWI_READ)) {
        return TWI_NO_ANSWER;
    }
    uint8_t xh = twiReadAck();
    uint8_t xl = twiReadAck();
    uint8_t zh = twiReadAck();
    uint8_t zl = twiReadAck();
    uint8_t yh = twiReadAck();
    uint8_t yl = twiReadNak();

    int16_t x = *(int8_t *)(&xh);
    x *= (1 << 8);
    x |= xl;

    int16_t y = *(int8_t *)(&yh);
    y *= (1 << 8);
    y |= yl;

    int16_t z = *(int8_t *)(&zh);
    z *= (1 << 8);
    z |= zl;

    switch (magRange) {
        case r1g3:
            v->x = (((double)x) * 1.3 / MAG_NORMALIZE);
            v->y = (((double)y) * 1.3 / MAG_NORMALIZE);
            v->z = (((double)z) * 1.3 / MAG_NORMALIZE);
            break;
        case r1g9:
            v->x = (((double)x) * 1.9 / MAG_NORMALIZE);
            v->y = (((double)y) * 1.9 / MAG_NORMALIZE);
            v->z = (((double)z) * 1.9 / MAG_NORMALIZE);
            break;
        case r2g5:
            v->x = (((double)x) * 2.5 / MAG_NORMALIZE);
            v->y = (((double)y) * 2.5 / MAG_NORMALIZE);
            v->z = (((double)z) * 2.5 / MAG_NORMALIZE);
            break;
        case r4g0:
            v->x = (((double)x) * 4.0 / MAG_NORMALIZE);
            v->y = (((double)y) * 4.0 / MAG_NORMALIZE);
            v->z = (((double)z) * 4.0 / MAG_NORMALIZE);
            break;
        case r4g7:
            v->x = (((double)x) * 4.7 / MAG_NORMALIZE);
            v->y = (((double)y) * 4.7 / MAG_NORMALIZE);
            v->z = (((double)z) * 4.7 / MAG_NORMALIZE);
            break;
        case r5g6:
            v->x = (((double)x) * 5.6 / MAG_NORMALIZE);
            v->y = (((double)y) * 5.6 / MAG_NORMALIZE);
            v->z = (((double)z) * 5.6 / MAG_NORMALIZE);
            break;
        case r8g1:
            v->x = (((double)x) * 8.1 / MAG_NORMALIZE);
            v->y = (((double)y) * 8.1 / MAG_NORMALIZE);
            v->z = (((double)z) * 8.1 / MAG_NORMALIZE);
            break;
        default:
            return ARGUMENT_ERROR;
    }

    return SUCCESS;
}
Beispiel #7
0
void lcdPutChar(char c) {
	twiStartWait(LCD_ADDRESS+I2C_WRITE);
	twiWrite(c);
	twiStop();
}