Hola, estoy haciendo un escaner 3D con un sensor IR y quisiera obtener la distancia (getDistance()
y guardar en SD (write_to_SD(x,y,z)
cada un n煤mero de pasos del motor configurable mediante una variable. Como veis en el trozo de c贸digo que he puesto, cada paso de motor mide y guarda, y claro, para 200 pasos por vuelta puede ir bien, pero cuando le pongo micropasos a 3200 pasos por vuelta, pues es demasiada precisi贸n adem谩s de que se ralentiza mucho el motor.
No soy programador y no tengo mucha idea de arduino, agradecer铆a si alguien me puede echar una mano.
//If the scanning proces is ON
if(scan == 1)
{
聽 //We stop when we reach the maximum height
聽 if(z < z_axis_height)
聽 {聽 聽
聽 聽 digitalWrite(enable_r,LOW);聽 //enable the turntable driver
聽 聽 聽 digitalWrite(dir_r,LOW);聽 聽 聽 //turntable spin to right聽 聽
聽 聽
聽 聽 for(int loop_cont = 0 ; loop_cont < steps_per_rotation_for_motor; loop_cont++)
聽 聽 {
聽 聽 聽 getDistance();
聽 聽 聽
聽 聽 聽 digitalWrite(step_r,HIGH);聽 聽 //make a step
聽 聽 聽 delayMicroseconds(step_delay);
聽 聽 聽 digitalWrite(step_r,LOW);
聽 聽 聽 delayMicroseconds(step_delay);
聽 聽 聽 angle = angle + RADIANS;聽 聽 聽 //Increase the angle by one more unit
聽 聽 聽 write_to_SD(x,y,z);聽 聽 聽 聽 聽 //Write x, y, z files to SD card function
聽 聽 聽
聽 聽 }
angle = 0;聽 //Reset the angle value for next rotation
Buenos dias, aqui tienes algo que hace lo que tu pides, y esta muy realizado.Code 3D scanner IR sensor
Quizas te sirva de ejemplo para verlo
Ese mismo c贸digo es el que he utilizado de partida y lo quiero modificar seg煤n comentaba.
Ahora nos enteramos que es el mismo c贸digo. En ning煤n lado lo dices y como a煤n nadie puede leer mentes tampoco pudimos inferirlo del trozo de c贸digo que has posteado.
Es importante que se brinde siempre toda la informaci贸n para lograr entender de qu茅 estas hablando.
Bueno y ya que tu problema son los micropasos, dinos que hardware estas usando o debemos suponerlo tambi茅n?
Comprendes que todo se resume a lo mismo. Haces una pregunta sin dar informaci贸n y mientras nosotros no podemos responder basados en lo que has puesto.
Del esquema que veo gracias a @Lurdab, se deduce que son DRV8825 y esos drivers tiene 3 pines A0 A1 A3 que permiten el ajuste en micropasos.
Ahora miro lo que has publicado y me encuentro con que luego de cada microstep se envias datos a la SD?
delayMicroseconds(step_delay);
聽 聽 聽 angle = angle + RADIANS;聽 聽 聽 //Increase the angle by one more unit
聽 聽 聽 write_to_SD(x,y,z);聽 聽 聽 聽 聽 //Write x, y, z files to SD card function
sabes cual es el tiempo que demora una SD en modo escritura? 5mseg por lo tanto ese delayMicroseconds(step_delay) termina siendo de 5mseg mas los 3000 useg o sea 3 mseg mas, total 8 mseg
Es algo con lo que no puedes pelear usando delays
Lo que deber铆as hacer es mover ese stepper de un modo mas inteligente. Tal vez con AccelStepper.h
Sugerencia nada mas. Habr铆a que ponerse con tu problema y verlo con detenimiento.
Ok, entiendo que cada micropaso va a tardar como m铆nimo 5mseg que es el tiempo que se tarda en escribir en la SD.
Suponiendo que tengo los 3200 micropasos, 驴que podr铆a hacer para hacer una medici贸n y guardado en la tarjeta cada 16 micropasos por ejemplo? O sea, enviar datos a la SD cada 16 micropasos.
Gracias
Puedes por ejemplo almacenar datos en un buffer y luego volcarlos todos en un solo momento.
Una t茅cnica mas eficiente es llenar un buffer al m谩ximo que tolera la instrucci贸n de grabaci贸n y de ese modo aprovechas ese momento sin desperdiciar nada.
No recuerdo si el tama帽o era 256 bytes o 512. Lo busco y te respondo luego.
Creo que es 512 bytes.
Estoy leyendo publicaciones comentarios y se habla de latencias mucho mas altas que los 5 mseg que te he dicho.
Deber铆as hacer tus propias lecturas.
Mira este c贸digo RawWrite
Veras las tasas de escritura que alcanzan.
A ver si lo entiendo, en un buffer puedo almacenar hasta 512 bytes de lecturas y despu茅s enviarlas a la microSD?
El c贸digo RawWrite es un ejemplo de buffer?
Si pero tmb es un ejemplo de transferencia en modo cont铆nuo, algo que no puedes hacer tu si no lo malinterpreto porque debes atender otras cosas.
De todos modos observa los ejemplos de la librer铆a SdFat y ver谩s que alguno se ajusta mejor a tu necesidad.
Acabo de ver este y creo que es ideal para tu caso.
LowLatencyLogger.ino que es lo que tu haces, no importa el objetivo del programa, lo adaptas a tu necesidad.
Observa lo que dice:
/*This program logs data to a binary file. Functions are included
- to convert the binary file to a csv text file.
- Samples are logged at regular intervals. The maximum logging rate
- depends on the quality of your SD card and the time required to
- read sensor data. This example has been tested at 500 Hz with
- good SD card on an Uno. 4000 HZ is possible on a Due.
- If your SD card has a long write latency, it may be necessary to use
- slower sample rates. Using a Mega Arduino helps overcome latency
- problems since 12 512 byte buffers will be used.
- Data is written to the file using a SD multiple block write command.
Ok, acabo de verlo. No me veo capaz de adaptarlo a mi programa, no soy programador y se muy poquito de programaci贸n.