Ejemplo n.º 1
0
void get_rgb(int16_t *r, int16_t *g, int16_t *b)
{
	#ifdef AUDIO_DROPLET
		uint8_t write_sequence = 0xB4;
		uint8_t result = TWI_MasterWriteRead(RGB_SENSE_ADDR, &write_sequence, 1, 8);
		uint16_t* temp_values = (uint16_t*)(twi->readData);
		if(result)
		{
			//*c=temp_values[0];
			*r=(int16_t)temp_values[1];
			*g=(int16_t)temp_values[2];
			*b=(int16_t)temp_values[3];
		}
		else printf_P(PSTR("Read failed.\r\n"));
	#else
		int16_t rTemp,gTemp,bTemp;
	
		rTemp = get_red_sensor();
		gTemp = get_green_sensor();
		bTemp = get_blue_sensor();		
		rTemp = rTemp - r_baseline;
		gTemp = gTemp - g_baseline;
		bTemp = bTemp - b_baseline;
		//if(rTemp<0)	rTemp=0;
		//if(gTemp<0)	gTemp=0;
		//if(bTemp<0)	bTemp=0;
		if(r!=NULL) *r = rTemp;
		if(g!=NULL) *g = gTemp;
		if(b!=NULL) *b = bTemp;
	#endif
}
Ejemplo n.º 2
0
bool DropletCustomOne::check_safe ( void )
{
    if ( get_red_sensor() > RED_THRESHOLD )
    {
        return false;
    }

    return true;
}
Ejemplo n.º 3
0
void rgb_sensor_init()
{
	#ifdef AUDIO_DROPLET
		uint8_t power_on_sequence[8] = {0x80, 0x01,  // Write 0x01 to ENABLE register, activating the device's oscillator.
										0x8F, 0x01,  // Write 0x01 to CONTROL register, setting the gain to x4.
										0x81, 0xD5,	 // Write 0xD5 to ATIME register, setting the integration time to 2.4ms*(256-ATIME)
										0x80, 0x03};  // Write 0x03 to ENABLE register, activating the ADC (and leaving the oscillator on);

		uint8_t result = TWI_MasterWrite(RGB_SENSE_ADDR, &(power_on_sequence[0]), 2);
		if(!result)	printf_P(RGB_SENSE_POWERON_FAILURE,1);
		delay_ms(5);
		result = TWI_MasterWrite(RGB_SENSE_ADDR, &(power_on_sequence[2]), 2);
		if(!result)	printf_P(RGB_SENSE_POWERON_FAILURE,2);
		delay_ms(5);
		result = TWI_MasterWrite(RGB_SENSE_ADDR, &(power_on_sequence[4]), 2);
		if(!result)	printf_P(RGB_SENSE_POWERON_FAILURE,3);
		delay_ms(5);
		result = TWI_MasterWrite(RGB_SENSE_ADDR, &(power_on_sequence[6]), 2);
		if(!result)	printf_P(RGB_SENSE_POWERON_FAILURE,4);
		delay_ms(5);
	#else		
		RGB_SENSOR_PORT.DIRCLR = RGB_SENSOR_R_PIN_bm | RGB_SENSOR_G_PIN_bm | RGB_SENSOR_B_PIN_bm;

		ADCA.REFCTRL = ADC_REFSEL_AREFA_gc;
		ADCA.CTRLB = ADC_RESOLUTION_LEFT12BIT_gc | ADC_CONMODE_bm;
		ADCA.PRESCALER = ADC_PRESCALER_DIV256_gc;
		/* When differential input is used, signed mode must be used. (sec. 28.6 of Manual) */

		ADCA.CH0.CTRL = ADC_CH_INPUTMODE_DIFFWGAIN_gc | ADC_CH_GAIN_1X_gc;	//Probably should turn the gain back up to 4X when we put the shells on.
		ADCA.CH1.CTRL = ADC_CH_INPUTMODE_DIFFWGAIN_gc | ADC_CH_GAIN_1X_gc;	//Probably should turn the gain back up to 4X when we put the shells on.
		ADCA.CH2.CTRL = ADC_CH_INPUTMODE_DIFFWGAIN_gc | ADC_CH_GAIN_2X_gc;	//Probably should turn the gain back up to 4X when we put the shells on.
	
		ADCA.CH0.MUXCTRL = ADC_CH_MUXPOS_PIN5_gc | ADC_CH_MUXNEG_INTGND_MODE4_gc;	// Red sensor on ADC A channel 0
		ADCA.CH1.MUXCTRL = ADC_CH_MUXPOS_PIN6_gc | ADC_CH_MUXNEG_INTGND_MODE4_gc;	// Green sensor on ADC A channel 1
		ADCA.CH2.MUXCTRL = ADC_CH_MUXPOS_PIN7_gc | ADC_CH_MUXNEG_INTGND_MODE4_gc;	// Blue sensor on ADC A channel 2
	
		ADCA.CALL = PRODSIGNATURES_ADCACAL0;
		ADCA.CALH = PRODSIGNATURES_ADCACAL1;

		ADCA.CTRLA = ADC_ENABLE_bm;
	
		//read_color_settings();
	
		delay_us(50);
		const int8_t num_samples = 3;
		get_red_sensor(); get_blue_sensor(); get_green_sensor();
		delay_ms(10);
		int16_t r_avg=0, g_avg=0, b_avg=0;
		for(uint8_t i=0; i<num_samples; i++)
		{
			r_avg+=get_red_sensor();
			g_avg+=get_green_sensor();
			b_avg+=get_blue_sensor();
			delay_ms(10);
			//printf("\r\n");
		}
		r_baseline= r_avg/num_samples;
		g_baseline= g_avg/num_samples;
		b_baseline= b_avg/num_samples;
		//printf("Baselines:\r\n%3d  %3d  %3d\r\n", r_baseline, g_baseline, b_baseline);
		r_baseline = 0;
		g_baseline = 0;
		b_baseline = 0;	
	#endif		
}