Электронный компас на LSM303DLH

Распечатать

Попала в мои цепкие рученки одна интересная деталька. Трехосевой цифровой акселерометр, совмещенный с цифровым магнитометром, чувствительностью до 1.5 Гаусса. К слову, сила магнитного поля Земли около 0.4 Гаусса. Почти треть диапазона, так что из этой фиговины может получится вполне годный электронный компас. К слову, цена вопроса всего 350р за микросхему. Вполне по божески, учитывая набортный фарш и чувствительность этой микросхемы.

Микросхема LSM303DLH
Особо любопытно выглядит пузико — натуральная печатная плата. С дорожками и переходными дырками. Сразу расхотелось делать под ней дорожки. А то какая-нибудь заусеница на дорожке проковыряет лак на пузе и коротнет не туда.

Что еще не понравилось — контактные площадки не видно с торцов. Позиционировать и проверять точность запайки сложно. В этом плане QFN корпуса удобней.

Размером корпус 5х5 мм. Как тетрадная клеточка. Ужас :)

Схемотехника
Вот тут начинается веселуха. Складывается ощущение, что товарищи в ST решили не изобретать новую топологию кристалла, а банально запихали под один корпус акселерометр и магнитометр. Так что у них даже линии I2C интерфейса разные. Разная адресация и разное питание интерфейсов.

Питание микросхемы (на схеме VDD) 3.3 вольта. Но тут есть одна заковыка. Акселерометр может работать полностью от 3.3 вольт, а магнитометру требуется 1.8 вольт. Причем есть подозрение, что где то там ошибка даташита. Либо питание IO акселерометра не может быть 3.3 вольта, либо у магнитометра питание IO может быть выше 1.8 вольт. В общем очень все странно. Проверять я не рискнул, тем более по всем AN показана схемотехника, где интерфейсное питание и акселя и магнитометра 1.8 вольт. В общем, я решил перестраховаться и запитать их от 1.8 вольт. Ради этого я вкорячил в схему LM317, самое мелкое, что смог найти в наличии. LM317 это линейный стабилизатор с управляемым напряжением. Отношение R1 и R2 определяют выходное напряжение. У меня R1= 510 Ом. А R2=200 Ом, что дает примерно 1.74 вольта.

Также потребовался конвертер уровня I2C шины между 1.8 и 3.3 вольт. Иначе подача 3.3 вольт, на SDA/SCL линий может угробить микросхемку. Специальную микросхему конвертера искать мне было впадлу, поэтому я сколхозил его из первых попавшихся полевичков.

Посмотреть схему целиком

По быстрому развел небольшой модуль:

Печатка
Корпус просто прелесть! LGA28, мать его. Когда я впервые взял в руки эту «тетрадную клеточку» да с семью выводами с каждой стороны… В общем я конкретно так фаломорфировал. КАК???

Потом вспомнил, что я джедай 80го уровня по ЛУТ технологии, а принтер еще не окончательно скатился в УГ и что то еще даже печатает. Так что откатал и вытравил без особых проблем.

Тонер идеально лег, глянцевый слой ушел отовсюду сам, без малейших усилий.

После вытравил все в своем убитом и грязном растворе хлорного железа. Тем не менее получилось неплохо.

Смыл тонер и можно паять. Лудил обычным припоем.

Заодно опробовал новую пачку фотобумаги Lomond. Результат оказался даже лучше чем на прошлой пачке. Вот такая вот обложка. Рекомендую, отличный ЛУТ результат!

Обложка целиком

Монтаж
Запаялось, кстати, на удивление легко. Поставил примерно на место, дунул феном и готово. Даже сам не ожидал, что будет все так просто. Остальная комплектуха напаивается тривиально.

Видео урок по пайки LGA на коленке я обязательно сделаю, но попозже.

Интрефейс
Сразу скажу, что до акселерометра у меня руки еще не дошли. Да и не интересен он мне был особо. В первую очередь меня интересовал магнитометр. С акселем я разберусь позже

Работать с ним очень просто. Обращаемся с ним как с обычной EEPROM. Адрес устройства на i2c шине = 0x3C, адрес ячейки однобайтный.

У магнитометра есть лишь несколько регистров конфигурации. Подробно биты посмотрите в даташите. Я лишь кратко опишу.

  • CRA_REG_M — выбор частоты замера и смещения. Я просто выставил 30Гц.
  • CRB_REG_M — выбор коэффициента усиления магнитометра. Я оставил по дефолту, на максимуме.
  • MR_REG_M — режим работы. Спящий, одиночный замер, циклический замер.
  • OUT_X_H_M — Ось Х старший байт
  • OUT_X_L_M — Ось Х младший байт
  • OUT_Y_H_M — Ось Y старший байт
  • OUT_Y_L_M — Ось Y младший байт
  • OUT_Z_H_M — Ось Z старший байт
  • OUT_Z_L_M — Ось Z младший байт
  • SR_REG_M — Статусный регистр. Позволяет включить внутренний стабилизатор напряжения, а также показывает заблокированые ли выходные регистры.
  • IRx_REG_M — Байты идентификации. Вроде серийного номера.

Вначале инициализация. Модуль надо включить. И настроить частоту обновления

CRA_REG_M = 0х14 -- выставялем частоту обновления в 30Гц
MR_REG_M = 0x00 -- переключаем в активный режим, непрерывное преобразование.

Дальше надо лишь читать периодически 6 выходных регистров

  • OUT_X_H_M
  • OUT_X_L_M
  • OUT_Y_H_M
  • OUT_Y_L_M
  • OUT_Z_H_M
  • OUT_Z_L_M

Причем если мы начали считывать с любого выходного регистра, то остальные регистры блокируются на запись до тех пор, пока мы не считаем все выходные регистры. Так что считывать надо сразу все шесть. Значения в регистрах знаковые, от -2048 до +2048.

Код
Использовалась библиотека TWI которую я уже описывал ранее.

Тут только прикладной код, под RTOS. Весь код в архиве. Как у меня построено, каждое действие расписано на две функции. Начало и конец. Между ними управление отдается диспетчеру.

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
//========================================
//Область задач
//========================================
 
 
// Init MAG
// CRA_REG_M = 14
// Пишем первый байт инициализации 
 
void InitMAG(void)
{
 
AddLog('1');						// Пишем все в лог
 
if (!LSM_WriteByte(0x3C,0x00,0x14,&InitMAG_))		// Запись в магнитометр
	{
	SetTimerTask(InitMAG,30);			// Если не удалось, пробуем снова, через 30мс
	AddLog('2');
	}
}
 
void InitMAG_(void)
{
i2c_Do &= i2c_Free;				// Освобождаем шину
 
AddLog('3');					// Пишем в лог. Для отладки
 
if(i2c_Do & (i2c_ERR_NA|i2c_ERR_BF))		// Если запись не удалась
	{
	SetTimerTask(InitMAG,20);		// повторяем попытку
 
	AddLog('4');				// Пишем в лог
	}
else
	{
	SetTask(InitMAG2);			// Если все ок, то идем на следующий
 
	AddLog('5');
	}												
}
 
 
 
// InitMAG2
// MR_REG_M = 0x00 
// Пишем второй байт инициализации
 
void InitMAG2(void)
{
	AddLog('6');
 
if (!LSM_WriteByte(0x3C,0x02,0x00,&InitMAG2_))	
	{
	SetTimerTask(InitMAG2,30);
	AddLog('7');
	}
}
 
 
void InitMAG2_(void)
{
	AddLog('8');
 
i2c_Do &= i2c_Free;				// Освобождаем шину
 
if(i2c_Do & (i2c_ERR_NA|i2c_ERR_BF))		// Если запись не удалась
	{
	SetTimerTask(InitMAG2,20);		// повторяем попытку
 
	AddLog('9');
	}
else
	{
	SetTask(ScanMAG);			// Если все ок, то идем сканировать
 
	AddLog('A');
	}												
}
 
 
 
// ScanMAG
// Чтение регистров датчика. 
 
void ScanMAG(void)
{
 
//AddLog('B');
 
if (!LSM_ReadByte(0x3C,0x02,7,&ScanMAG_))		// Запускаем процесс чтения 7 байт. Начиная с MR_REG
	{
	SetTimerTask(ScanMAG,10);
	AddLog('C');
	}
}
 
 
void ScanMAG_(void)
{
s16 RES;
u16 RS;
 
i2c_Do &= i2c_Free;				// Освобождаем шину
 
if(i2c_Do & (i2c_ERR_NA|i2c_ERR_BF))		// Если запись не удалась
	{
	SetTimerTask(ScanMAG,80);		// повторяем попытку
	AddLog('E');				// И пишем код ошибки
	}
else
	{
	MAGX = (s16)(i2c_Buffer[1]<<8) | i2c_Buffer[2];	// Выгружаем из буфера данные в 
	MAGY = (s16)(i2c_Buffer[3]<<8) | i2c_Buffer[4];	// переменные по осям
	MAGZ = (s16)(i2c_Buffer[5]<<8) | i2c_Buffer[6];
 
	SetTimerTask(ScanMAG,100);		// Сканим каждые 100мс. 
 
	AddLog(0);				// Метка координаты Х, чтобы проще анализировать лог
	RES = MAGX + 500;			// Добавляем смещение, чтобы избавиться от знака
	RS = ((u16)RES)/4;			// Делим на четыре, чтобы уместиться в 8бит. 
	AddLog((u08)RS);			// Это пихаем в лог
 
	AddLog(1);				// Метка координаты Y, чтобы проще анализировать лог
	RES = MAGY + 500;			// Добавляем смещение, чтобы избавиться от знака.
	RS = ((u16)RES)/4;			// Делим на четыре, чтобы уместиться в 8бит
	AddLog((u08)RS);			// Результат пихаем в лог. 
	}
}
 
// Запись в лог
void AddLog(u08 i)
{
if(WorkIndex == 100) 
	{
	SetTask(LogOut);	// Если записали до конца, то ставим очередь задачу выгрузки
	return;
	}
 
WorkLog[WorkIndex]= i;		// Иначе просто пишем в лог.
WorkIndex++;
}
 
 
void LogOut(void)		// Выброс логов, тут все просто. 
{
u08 i;
 
for(i=0;i!=WorkIndex+1;i++)
	{
	UDR = WorkLog[i];
	_delay_ms(30);
	}
 
WorkIndex=0;
}

Опыт
Я только начал экспериментировать и многое делал вручную. Модуль питается от 3.3 вольт, поэтому внимательней. Если кто экспериментирует на Pinboard, то переставьте фишку питания на 3.3 вольта. Если при этом возникнут проблемы с работой бутлоадера, то заюзайте встроенный FTBB программатор. Батники для него в архиве проекта.

Затем приклеил датчик к дну перевернутого стакана и поворачивая его на 45 градусов, снял выходную характеристику по осям Х и Y. Потом загнал все в Exel.

Кот Сосис контроллировал процесс.

Если учесть, что Х и У нормальны друг другу, а магнитометр замеряет проекцию магнитного поля Земли (направленную на север), то результатом должны быть две синусоиды, сдвинутые на 90 градусов. Что и получилось.

Результаты плавают на 10 градусов гдет, но мне интересней было посмотреть на сдвиг фаз, поэтому я не стал их все вбивать, загнал данные одного оборота и просто накопипастил для наглядности, чтобы сделать несколько периодов. Несмотря на одинаковые коэффициенты усиления Y имеет несколько большее смещение. Видимо влияние топологии печатной платы, а может и дорожка какая подмагничивает. Хотя там нет ничего мощного. Так что надо под каждый конкретный вариант калибровать.

Теперь только останется загнать все один масштаб. А дальше все просто

Азимут = arctg(Y/X)

Вот и мы знаем куда нам ехать и куда глядит наш робот! Причем это абсолютные координаты, относительно севера.

Да это просто праздник какой то!
Но это в простейшем случае. Стоит только наклонить платоформу, как все наши построения летят к чертовой матери, т.к. мы больше уже не знаем чему равны проекции на самом деле. И вот тут на помощь нам приходит акселерометр! Который точно подскажет нам ориентацию платформы относительно земли. А также в дело пойдет ось Z магнитометра.

После чего начинается векторный матан. На основании показаний акселерометра начинаем делать коррекцию с учетом наклонов. Чую тут будет дофига тригонометрии и матриц. С матрицами МК справится на раз, а тригонометрию можно сделать таблично. Так что все решаемо. Может даже займусь на досуге и воплощу все это в виде модуля, четко показывающего угол на север, как бы его не повернули.

На новогодние праздники попробую заняться математикой и откалибровать хотя бы на плоскости. Чтобы четко получался угол. А там уж и замерим насколько он точно может определять градусы азимута.

Быстро - от 2-х р. дней! Дешево. Производство. Доставка по России.
Адрес и телефон  · 
Осциллографы реального времени с полосой 40 МГц - 60 ГГц. Гарантия и сервис
www.lecroy-rus.ru
Уникальная возможность - лицензионный P-CAD всего за 80 000 руб!
Адрес и телефон  ·  www.nanocad.ru
Самые точные 2/4/6/8/16/32 канальные осциллографы по ценам производителя
rudshel.com
Запись опубликована в рубрике Начинающим, Робототехника с метками , , , . Добавьте в закладки постоянную ссылку.

151 комментарий: Электронный компас на LSM303DLH

  1. alexeypa говорит:

    два вопроса:
    1. Насколько эта штука чувствительна к бытовой технике и другим предметам (просто интересно)
    2. Насколько точно, после колибровки в чистом поле, и включении его в другой точке (комнате, доме, материке) можно понять где север? или же каждый раз надо крутиться на 360 чтобы получить новые синусоиды?

  2. Alexey Burlakov говорит:

    У меня в комнате магнитное склонение гуляет на 90 градусов — комп, колонки, редкоземельные магниты по полке разбросаны, прочие радости.

    У нормальных людей тоже всё плохо.

    В открытом поле обычно всё вполне стабильно, если девайс не перемещается на сотни километров, то можно даже тупо захардкодить склонение, а не пользоваться тяжеленными картами.

  3. Dx говорит:

    Для вычисления угла по синусу/косинусу рекомендую алгоритм CORDIC
    Вот «моя» реализация — измеряю угол поворота магнита.
    http://electronix.ru/forum/index.php?s=&showtopic=10934&view=findpost&p=647087

  4. BuHTuk говорит:

    Насколько я понимаю с помощью акселерометра невозможно определить положение тела относительно Земли.

    • Roland_Deschain говорит:

      Одного — нет, а с помощью трёх — можно. Более того, это чуть ли не единственный способ определения ориентации. В сочетании с измерителями угловых скоростей даёт автономную систему позиционирования.

      • BuHTuk говорит:

        >>В сочетании с измерителями угловых скоростей даёт автономную систему позиционирования.
        в сочетании практически да, но как ты определишь своё положение в начальный момент времени?

    • alexeypa говорит:

      там как раз для этого акселерометр есть

      • BuHTuk говорит:

        Акселерометр выдает ускорения по осям.
        1) как ты определишь положение при включении??
        2) вращая тело с постоянной скоростью по осям что покажет тебе акселерометр?

        • DI HALT говорит:

          1. Всегда есть ускорение свободного падения. Зная его проекцию по осям мы гарантировано узнает ориентацию девайса в пространстве.

          Имея компас мы сможем на основании данных акселерометра определить какие оси у нас куда направлены и какую часть земного поля они ловят.

          Все. Имеем азимут.

          2. Ускорение свободного падения. Т.е. 9.8

          • BuHTuk говорит:

            Так ведь ускорение свободного падения это не сила)
            Пока тело никуда не падает нет никакого ускорения.

            З.Ы. я не пытапюсь убедить в обратном, просто не могу в этом разобраться…

          • DI HALT говорит:

            Вес это сила которая всегда с тобой. Так что акселерометр ВСЕГДА показывает ускорение на осях обращенных вниз или вверх.

            Исключение одно — когда акселерометр начинает падать и оказывается в невесомости.

            Принцип работы акселерометра знаешь? ТАм стоит болванка которая болтается в зависимости от ускорения. Ну и сила тяжести на нее действует тоже.

          • BuHTuk говорит:

            Ясно. Спасибо.
            Значит он измеряет не ускорения, а силы действующие по осям.

            Я считал, что он измеряет ускорения относительно Земли.

          • BuHTuk говорит:

            ну тоесть проекции сил на оси

          • DI HALT говорит:

            Ускорения он меряет. Ускорения. Приращения скорости. А ускорение может возникнуть только под действием силы.

          • BuHTuk говорит:

            Ладно. Тут не важно как назвать — они линейно пропорциональны.

            А вот можно ли имея один акселерометр определить угол поворота вокруг вертикальной оси? Видимо нет, для чего и пригодится компас.
            А вот наклоны относительно горизонтальной плоскости распознать можно.

          • valio говорит:

            Все правильно понимаешь Винтик.

            Акселерометр — он показывает как раз ускорение: a=F/m.

            Положение (или точка пути), как мы знаем есть двойной интеграл — вначале от ускорения и затем от скорости. В процессе интегрирования появляются две постоянные интегрирования С — первая С1 как постоянная к скорости, вторая С0 как постоянная к положению, пути. Они-то как раз и неизвестны или постоянно(!) будут прирастать а пути (через постонную С1). Можно теоритически вычислить компенсацию от магнитомера конечно. Чего тут не понятно Ди ?

            Вообще проект очень понравился ! Молодец Ди, побольше таких мудреных фенечек. Сам хотел повозтся с этим датчиком )

            ———————

            На тему бумаги конструктив.

            Вырезал из обойноклейкой «333″ бумаги А4 и уже кажется 10-ю плату подряд на одном этом листе печатаю, без гемморного размывания целлюлозы под водой и трепетной проверки потом. Не дешевле и проще и удобнее пользовать ее вместо того чтобы искать этот ломонд ?

          • DI HALT говорит:

            У меня с самоклейкой как то не срослось. Переводится нормально, но часто в процессе прикладки к плате смазывается.

          • BuHTuk говорит:

            Спасибо =)
            Вот теперь все встало на свои места)

          • Orion33 говорит:

            Что-то, господа, у вас каша в голове)
            Акселерометр показывает что? Правильно, ускорение. Которое есть приращение скорости. А если есть скорость, то что? Правильно, тело должно двигаться! Опаньки… А ведь плата с акселерометром у нас никуда не едет и не летит. Чо за фигня? А, правильно! Забыли курс очень средней школы =) Ну бывает, я напомню. Когда тело покоится, то все силы, действующие на него уравновешены, а ускорение, стало быть, равно 0. Значит, и сила тяжести уравновешена какой-то другой. Сила реакции опоры называется. Поэтому в статическом положении акселерометр не будет ничего показывать. А при движении будет показывать лишь неуравновешенную составляющую, которая и вызывает перемещение. Для МК сила тяжести всегда равна силе реакции опоры, потому что он никуда с платы не отваливается.
            Т.о. с помощью акселерометра можно отследить лишь относительные перемещения (со всеми вытекающими, например, накоплением погрешности).
            Устройства, которые показывают абсолютное отклонение от нормали к Земле (а именно по этому направлению действует сила тяжести, неравномерностью радиусов Земли как эллипсоида можно пренебречь), называются гироскопы
            ЗЫ. Разумеется, эта маленькая оплошность никак не умаляет достоинство автора этого сайта как программиста ;)

          • DI HALT говорит:

            В статическом положении акселерометр показывет G по одной из осей. Т.к. его принцип это балласт на пружине. А выходные показания — величина растяжения этой нанопружины. Чем больше ускорение, тем сильней пружина растягивается (т.к. изза своей массы не поспевает за наростающей скоростью) — тем выше показания. Это если по ХУ а по Z пружину растягивает сила тяжести. Всегда. Так что в статике он тоже покажет ускорение, ускорение свободного падения. Спорить не надо, подключи да увидь это сам.

          • Orion33 говорит:

            Ок. Значит тогда получается, что этот акселерометр способен показывать абсолютную величину? Просто я в свое время изучал вопрос о возможности использовать бесконтактные датчики в джойстиках и отказался от акселерометра в пользу холлов именно по причине относительности показаний и накопления ошибки. Если можно, небольшой лог данных при отклонении на +-15*

          • DI HALT говорит:

            Да, угол относительно земли можно мерять на раз. Там же проекция G будет в зависимости от угла. И ошибка накапливаться не будет, т.к. ускорение абсолютное. А вот точность… тут трудно сказать, хотя, думаю, до градуса можно будет вытянуть, а при продвинутой фильтрации и того больше. Лог не дам, надо искать эту шнягу и подключать. Я хз куда я ее сунул.

  5. SIM говорит:

    А без кота на столе будет работать устройство? А то у меня собака только :) :) :)

  6. -=Andru}{a=- говорит:

    Надо еще подумать как с вибрациями бороться. Вед на акселерометр они влиять должны жутко.

  7. Si-Soft говорит:

    alex_avr, Вы для меги опорное напряжение от гироскопа брали? ФВЧ использовали?

    • alex_avr говорит:

      Опорное брал 2.56, встроенное в мегу.
      Опорное от гироскопа взять не получится потому что мега измеряет напряжения 0-Vопорное, а на выходе может быть напряжение больше опорного при вращении в (+) сторону. Если я правильно помню, то с дифференциальным та же беда — мега не умеет измерять отрицательные напряжения.
      Использовал оба фильтра рекомендуемые в даташите. Вообще результаты по шумам меня очень удручили. Не став особо ковыряться с мегой, собрал схему с фотографии с 24х битным АЦП. Однако проект временно я забросил. Вышеуказанную платку я подключил всего один раз и поигрался с ней пару часиков. Конечно шум был на порядок меньше чем с АЦП АВР, но всеравно был приличным, кроме того выяснились всякие неприятные моменты, типа плавающего опорника в зависимости от напряжения питания и крайне нестабильных выходных характеристик. Наверное с этим можно побороться, но я пока не занимался этим. Может и не буду заморачиваться и возьму цифровой гироскоп от АД.
      Ах да, для 24х битного АЦП использовал в качестве опрного напряжение самого гироскопа уже.

      • Si-Soft говорит:

        Спасибо, тогда тоже лучше поищу цифровой. Благо не заказал еще микросхемки.

      • DI HALT говорит:

        АВРовский ион весьма стремный. Он питания ОЧЕНЬ сильно зависит. Тут лучше внешний ион поставить.

        • alex_avr говорит:

          Забавно, я собирал схему, где напряжение питания в момент включения силовых ключей просаживалось с 5 вольт до 3 вольт и потом довольно долго росло обратно. При этом там использовался встроенный в мегу опорник 1.1 вольт для измерения напряжения до 400В через делитель. Впрочем точность там нужна была не очень большая 5-10В дискретности вполне хватило бы.

          Схема себя отлично показала и в боевых условиях очень долго работала, да и до сих пор работает :)

          Впрочем если буду делать еще раз то конечно внесу туда множество поправок, в том числе связанных и с точностью измерения напряжения.

  8. Si-Soft говорит:

    Ну посмотрел, цены — не подарок.
    Я сейчас хочу сделать инерционный манипулятор, хотел использовать 2х-осный гироскоп в паре с 3х-осным акселерометром, ну вот думаю от гироскопа откажусь(до лучших времен). Не очень хочется добавлять лишнее детальки(АЦП, ИОН) их и так там много, да и плату почти развел. А цифровой лепить тоже некуда, у меги88 почти все ножки заняты, а у AD я смотрю только SPI. Так что я думаю поделиться опытом с вами не смогу.

  9. Anatol говорит:

    Ди, что-то я не могу сообразить, как работает твой «конвертер уровней». Можешь расшифровать?

    • DI HALT говорит:

      Да все просто. КОгда на высокой стороне идет прижимка к земле, то через паразитный диод полевика прижимается и низкая сторона.

      Когда на низкой стороне идет прижимка линии к земле, то транзистор открывается и через транзистор верхняя сторона прижимается к земле.

      В результате уровни разные, а активный (нулевой) уровень и2с шины спокойно проходит слева направо и справа налево.

      • Anatol говорит:

        М, логично :)
        Спасибо!

        А падения на диоде не слишком много для нуля при питании 1.8?
        У АВРок вроде при питании 1.8 гарантированным нулём считается только то что ниже 0.2Vcc, А это сильно меньше обычного диода. Как-то не очень красиво получается =( Или я что-то не учитываю?
        Работает это дело стабильно?

        • DI HALT говорит:

          Падение там вообще в ноль получается. По крайней мере если у меня у осцила одна клетка это была 2 вольта, то при закорачивании на землю высокой стороны на низкой сигнал рушился почти в ноль, сливаясь с осью Х. Работает очень стабильно и без сбоев.

          • Anatol говорит:

            Хм, а как такое может быть? Диод ведь есть диод, на нём никак меньше полвольта не будет…

          • Anatol говорит:

            Ага, написал, и тут же сообразил, что сначала-то работает диод, а потом уже и транзистор начинает открываться. Тогда действительно честно к нулю прижимает.

            PS Тяжело нам, программистам, в электронику переквалифицироваться…
            Но за то интересно :)

  10. warrior2031 говорит:

    Имеется altera usb blaster и отечественный аналог atmega8535.

    Нужно его прошить.

    Во-первых, хотелось бы узнать нужны ли на него драйверы? ОС Windows 7. Если да, то где их взять?
    На сайте альтеры пишут, что драйверы устанавливаются с Quartus. Мне квартус пока нафиг не уперся.

    Попробовал прошить avrdude через оболjчку USBASP, пишет что не подключен usbasp программатор (ну, это и понятно, он ведь не подключен).
    Если usb bluster-ом можно прошить через avrdude, то подскажите как прочитать значения fuse-ов и вообще понять видится ли контроллер компом?

  11. d-lun говорит:

    Какой красивый кот! :)

  12. Xapc говорит:

    Замечательный материал! Спасибо!
    Сделал ссылку на ресурс у себя на сайте.

  13. kreml говорит:

    R7 10k это не опечатка?

  14. kreml говорит:

    еще вопрос, int1,int2, drdy_m как то в дальнейшем используются?
    вобщем так получилось, что я тоже недавно начал эксперементы с этим чипом, но никак немогу разобраться с магнитным модулем, вместо данных какаято фигня получается, чтото вроде переодических повторений 0000 и ffff, но это только для выходных регистров магнт. сенсоров. при этом настроечные регистры и читаются и пишуться нормально. Акс полностью нормально работает, в чом причина немогу понять, думал может питание большое (3.33в), но у вас гляжу тоже самое, вот и ищу что еще может быть…
    а да, поменял 3 чипа, результат одинаков((

    • DI HALT говорит:

      это выводы готовности данных. Я их не юзаю, а вообще аксель и компас может отвлечь МК прерыванием через них. Мол готово — забирай. Все настраивается через конфиги.

  15. kreml говорит:

    отбой, после очередной пропайки, заработало
    если нетрудно, поделитесь опытом пайки лга, какую пасту используете, при какой температуре паяете…

    • DI HALT говорит:

      обычный припой в проволоке и фен. Нахера там паста то?

      • kreml говорит:

        дык я и спрашиваю потому что неимею никакого опыта пайки таких элементов. сначала пытался пастой, непонравилось, сделал пасту сам-напилил олова, смешал с флюсом, стало лучше, но тоже нефонтан. в конце концов стал просто лудить контакные площадки на плате и чипе, мазать флюсом и после этого уже греть феном… вот и спрашиваю, а какже праввильно все это делать?

        • DI HALT говорит:

          Как правильно я сам хз. Я лудил паяльником дорожки и пятачки на шарики у этого чипа. Потом мазал флюсом, клал и оно само оседало на дорожки идеально.

  16. masnk говорит:

    DI HALT, как у вас с вычислениями в наклонном положении? Делал девайс на магнитных датчиках HMC1022+HMC1021 и двухосевым акселерометром. В горизонтальной плоскости отлично а вот в наклоном все встало, не могу сообразить как считать трехмерные проекции. С нормированием вроде бы разобрался.

  17. andrew_freeman говорит:

    Ди, у тебя еще такие мелкосхемы есть?
    Хочу купить, а на ebay нет таких (

  18. Xapc говорит:

    Сделал отладку на базе этой микры, меги и гироскопа
    http://robochamp.ru/index.php/projects/117-ins
    Может кому интересно будет. Как разберусь с фильтрацией сигнала, выложу фильтры в матлабе.

  19. masnk говорит:

    Кто подскажет где можно купить L3G4200D, в Имотек нет.

  20. deemazadirako говорит:

    Спасибо автору. Интересный материал.
    А какова предельно дупустимая точность. С учетом калибровок и корекций. Чем ограничена в данном случае. Как понимаю, для уверенной работы в строго горизонтальной плоскости достаточно ввести калибровку, учитывающую влияние паразтных магнитных полей.
    Например, для компенсации внешних магнитных полей необходимо медленно поворачивая компас на 360˚, снять азимутальную характеристику. Под воздействием внешних магнитных полей получится замкнутая “кривулина”, например, эллипс. При отсутствии внешних паразитных магнитных полей диаграмма представляет собой круг с центром (0, 0) и радиусом равным величине He поля Земли. Снятую азимутальную диаграмму отнормировать. Компенсация заключается в конвертации искаженной диаграммы в круг единичного радиуса с центром (0, 0). Эта коррекция должна быть в каком-то виде запомнена, и впоследствии учтена при работе в режиме компаса.
    Верно рассуждаю. И по вашему мнению, при введении такой калибровки чему будет равна точность?

  21. Andrey_13 говорит:

    Проверил работу сего кристалла от одного источника питания 3.3 вольта — ничего не сгорело и все пашет. Автору — спасибо за статью.

  22. SeregaB говорит:

    > Несмотря на одинаковые коэффициенты усиления Y имеет несколько большее смещение. Видимо влияние топологии печатной платы, а может и дорожка какая подмагничивает.

    А это не магнитное наклонение ты видел?
    В Челябинске, насколько я понимаю 70 градусов должно быть.

  23. Andrey_13 говорит:

    > Несмотря на одинаковые коэффициенты усиления Y имеет несколько большее смещение. Видимо влияние топологии печатной платы, а может и дорожка какая подмагничивает.
    Такая же весчь — по Y каналу получается большое смещение — и канал зашкаливает — почему — непонятно — по X и Z все красиво — и графики при вращении и направление магнитного поля.
    Попробуем разобраться.

  24. Andrey_13 говорит:

    Смещение победил — переключил чувствительность в регистре CRB_REG_M на +-1.9 Гаусса — чувсвительность одинаковое — при кручении — небольшое смешение осей есть — но ничегго не зашкаливает.

    • DI HALT говорит:

      У тебя прям зашкаливало? Нет у меня до границы не доходило даже близко. Просто уплывало чутка. ТАк что я работал на максимальном усилении.

      • Andrey_13 говорит:

        Ага — шкалило, когла ось У направлена на север или юг — получал только 0xF000 — не знаю с чем эт связано — с питанием модуля (3.3 только) или то что еще бядом блютуз или плата кривая (макетка без заливки) — но факт — при чувствительности 1.3 ось У у меня шкалит, при чувствительности 1.9 — все гуд.
        Единственное не понял — как включать внутренний стабилизатор — регистр read_only. :-(

  25. labor говорит:

    Теоретически имея такую «клеточку», задав начальную точку и привязавшись к карте можно прокладывать и проходить маршрут без дополнительных приспособлений. По сути для навигации по маршруту нам надо знать начальную точку, направление движения, скорость, время движения. Направление получаем, время — считаем, скорость определяем ускорением, начальную точку и маршрут задаем.
    Я правильно понял принцип? Я сужу по том, как это реализовано в авиации. Получается вы можете сделать на выходе готовый навигационный комплекс модельного применения.

    Планируете ли вы продолжить работы по полному освоению этой микросхемы? С нетерпением буду ждать финальной статьи.

    • DI HALT говорит:

      Как бы да. Но вот только чувствительность акселя и магнитометра не дадут большой точности. Так что не так тут все просто.

      Осоваивать конечно буду, но пока не хватает времени.

      • labor говорит:

        Ну например вспоминая ваше шасси для робота, помнится у вас не было обратной связи по перемещению. Не известно было куда и сколько он едет. Вот вам сразу идея. Точности магнитометра и акселя достаточно будет для выявления углов кратно 5-10 градусам и перемещению на 5см при скорости в 20-30см/сек. Если реализуемо, то берем DTFM дешифратор (например), 2 телефона с безлимитным тарифом на звонки и делаем робота на мобилкоуправлении. 16 команд с телефона достаточно для передвижения и некоторых действий, а обратно можно таким же образом получать данные об углах и расстояниях. По типу «Сигнал данных угла» + «Данные угла» в DTFM кодировании, благо реализации проста до безобразия и универсальность тоже =)

    • Goluga говорит:

      В теории возможно, даже на практике используется на подводных лодках. Только там прецизионные приборы совсем не маленьких габаритов, и хитрая конструкция акселерометров у которых ускорения интегрируются самой механикой если не ошибаюсь. И то ошибка накапливается гигантская.

  26. Ultrin говорит:

    Собрал макетку с этой микрухой, поэкспериментировал немного.
    Возник вопрос: при вращении, на 360 градусов в горизонтальной плоскости, выход по X и Y должен проходить полный диапазон значений от -2048 до 2048 или гораздо меньше? У меня получается хорошо если треть выходного диапазона… Или у меня дома с магнитными полями не все гладко…

    • DI HALT говорит:

      Конечно меньше. Полный размах на максимальном увиличении около 1.2 гаусса. Магнитное поле Земли что то около 0.4 гаусса. Вот треть диапазона и получается.

      • Ultrin говорит:

        прикрутил ее щас как 2х осевой джой к винде — прикольно получается, а в режиме калибровки джоя — еще и наглядно… Надо дескриптор переписать чтоб 3 оси было (Rx, Ry, Rz) :)

      • Ultrin говорит:

        Сегодня обнаружил интересную деталь: оси акселерометра не соответствуют даташиту. Они получаются направлены в противоположную сторону. Может я чего-то не так понимаю?
        Вобщем у меня получается, если микросхема расположена ногами вниз, ключ находится в левом верхнем углу, ось z направлена в низ, ось x направлена влево и ось y направлена назад…

  27. SergeyDon говорит:

    подключил чип к Pinboard? никак не могу получить внятных данных в порту…
    на какой скорости надо получать данные?
    а то у меня сыпет только: E0 00 E0 00 E0 E0 00 00 E0 E0 00 E0 00 E0 E0 00 00 E0

    • DI HALT говорит:

      Да скорость любая в пределах стандарта i2c ты уверен, что верно его запаял?

    • SergeyDon говорит:

      юзаю «Проект прошивки для AVR Studio на Mega16 (Pinboard)»

      • DI HALT говорит:

        Это полностью рабочий проект. У меня он работает. Ты уверен, что компас тебе вообще что то отвечает? Осциллографом можешь поглядеть на бит ack?

    • DI HALT говорит:

      Скорость ком порта 19200 должна быть.

      • SergeyDon говорит:

        уже похоже на правду:
        80 00 1D 01 80 00 1C 01 81 00 1C 01 7E 00 1D 01 7F 00 1A 01 7F 00 1D 01 80 00 1D 01 7E 00 1C 01 81 00 1B 01 81 00 1C 01 7F 00 1A 01 80 00 1C 01 81 00 1B 01 7F 00 1C 01 82 00 1C 01 80 00 1A 01 80 00 1C 01
        это он неподвижен

        осциллографа пока нет, пайку проверил, вроде все в норме.

        я на «Cях» не силен, поэтому просто прошил GCC-RTOS.hex из архива, в надежде, что там все ОК ;)

        в какой последовательности идут данные (типа структура пакета)?

        Спасибо!

        • DI HALT говорит:

          80 начало обмена. После 00 идет один байт Х после 01 идет один байт Y данные нормируются под 1 байт прямо в контроллере.

        • DI HALT говорит:

          Ну и нажирается лог на 100 байт, а потом срыгивается.

        • DI HALT говорит:

          Кстати, делал по моей печатке? ИЛи свою разводил?

          • SergeyDon говорит:

            готовое юзаю :(
            сам пока такую мелкоту не осилю…

            http://www.pololu.com/catalog/product/1250

          • darkmoon говорит:

            Я бы хотел узнать по какой цене мне ты сможешь запаять lsm303 на своей платке???

          • DI HALT говорит:

            Да я их не продаю. Разве что ты в Челябинске свою принесешь так я те за пиво ее накатаю.

          • darkmoon говорит:

            какое и в каком кол-ве а то я сам штук сто сожгу пока буду делать :(

          • DI HALT говорит:

            Топаешь в Пиваторию, думаю в любую, но я гарантированно скажу только за ту, что на пересечнии Ленина/Энтузиастов, за угол от маркета Перекресток (или проспект?). В общем, где Уральские пельмени, только через дорогу, но по этой стороне Ленина.

            Там заливаешь два литра Крюгера Бархатного (после него любое бутылочно-фасованое моча). Ну и двигаешь ко мне. Живу я возле ТВК Калибр. Если притащишь микросхемку компаса и вытравленную плату, то я тебе ее сразу же и припаяю. Если платы нет, только микросхемка, то могу махнуть тебе ее на одну из готовых из уже распаяных плат. Только проверим ее предварительно на стенде. Отпишись на dihalt@dihalt.ru скоординируемся когда и во сколько.

  28. masnk говорит:

    Подскажите, в Codevision кто-нибудь писал под этот девайс?

  29. sasha85ru говорит:

    А что если распаять http://www.parkflyer.ru/37223/product/6755/#category-259
    В нём наверняка есть аксель, гироскоп и притом не один?

  30. Dimych8 говорит:

    Подскажите как перевести 2 байта с этого акселерометра в градусы ?
    И нормально ли что на ровной поверхности значения скачуть примерно +-100ед. ?

  31. joint931 говорит:

    На выходе акселерометра и магнитометра все время получаются значения 255… может у кого было уже такое? В чем проблема?
    Данный косяк не только у меня:
    http://www.microchip.su/showthread.php?t=11802 (моя тема с исходнгиками)
    http://forum.pololu.com/viewtopic.php?f=3&t=4010

  32. PolyTech говорит:

    Ух-ты, вот бы и мне по-скорее научиться такие вещи делать.

  33. Katbert говорит:

    Хочу поставить 2а таких датчика в одну плату. Смысл — дублирование от неисправности, дублирование для улучшения точности показателей. Относительно друго друга повёрнуты на 180гр. Верно ли, что мне лишь нужно замкнуть пин выбора адреса в одной микре на землю, в другой на +3.3V, и дальше соеденить их i2c линии. Никогда просто раньше с i2c не работал.

    http://cs11146.vkontakte.ru/u5148764/138803592/y_2827de55.jpg

  34. Alexey_1811 говорит:

    Почему у вас на схема резистор R7 10k, а на фото запаян 0?

  35. STRELOK369 говорит:

    Не подскажете к какому питанию относятся ноги INT1 и INT2 Vdd_IO_A или VDD? А то из даташита однозначно непонятно.

  36. Alecsej говорит:

    Немного о перфомансе LSM303.
    Для своей цены сенсор совсем неплох, особенно при условии тщательной калибровки.
    По методике описанной в аппноуте, после калибровки смещений и масштабов магнетометра, ошибка определения курса составила менее 5 градусов. А за счет калибровки мягкого железа и перекрестной чувствительности осей погрешность уменьшилась до 1-го градуса.
    На текущий момент статистика такова: из 10-ти образцов девять стабильно укладываются в градус и один не хуже 2 градусов.
    Учитывая что лет 10 назад цена подобных устройств легко переваливала за 700$, прогресс на лицо.

  37. den6051 говорит:

    При считывании старших байт магнитометра OUT_X_H_M,OUT_Y_H_M,OUT_Z_H_M , значение либо 0xFF,либо 0×00. С чем это может быть связано ?. Значения же младших байт изменяется нормально. У акселерометра и младшие и старшие байты тоже изменяются нормально.

  38. armagidon говорит:

    Вопрос для каких целей Вы это делаете.
    Я в электроннике не силён, но хочу воплатить одну идею, в которой как раз и нужен не сильно чувствительный электронный копас, это может принести не плохие деньги и помочь слепым.
    Конечно всегда есть НО, эту идею я увидел по телевизору в дискавери, и понял как мозг отреагировал на «опыт», но я не понял почему этим не воспользовались для людей с проблемами зрения.

  39. armagidon говорит:

    Если к Вашему компасу прибавить пояс с датчиками вибрации, пи этом датчик со стороны севера всегда вибрирует, то через месяц Вы сможите пройти сложный маршрут с завязанными глазами.
    Но такой пояс прийдётся носить весь день в течении месяца, пока мозг не освоит новое чувство.
    Можете попробовать.

  40. GennDALF говорит:

    Доброго времени суток, уважаемый DI HALT!
    Работаю сейчас с очень похожей микросхемкой, а именно LSM330DL.
    Не могли бы вы подробнее объяснить, как работает схема согласования уровней (на полевиках) — что-то до меня не доходит =)
    Спасибо!

    • DI HALT говорит:

      Когда с одной из сторон падает напряжение линии (утягивает кто то вниз) транзистор открывается тоже и дает прижать линию к земле с другой стороны. Причем в одном из случаев процесс начинается с того, что вначале напруга стекает через паразитные диоды, а когда на противоположной стороне просядет до падения диодов, то уже этого будет достаточно, чтобы транзистор открылся и дал возможность дожать до конца.

  41. Кирилл говорит:

    Di Halt, не обращали внимание на lsm330dl?
    На днях заказал пару штук, но пока они дойдут до меня — поседеть можно. :(

  42. reno777 говорит:

    А можете по подробнее о считывании векторов? На что вы выводите их значение?

  43. Кирилл говорит:

    Так как датчиков у меня на руках нет, я еще не вникал. Даже даташит не читал, только бегло просмотрел.

  44. 3acpaHeLL говорит:

    А можно поподробнее о том как получились такие вот красивые синусоиды? Какое усреднение значений делалось, обычное или скользящее. У меня более менее нормальные значение получаются после 1000 измерений. Что бы получить график хотя бы из 30 значений, на максимальной скорости, нужно минут 7 делать 1 оборот)) Это нормально?

    • DI HALT говорит:

      Усерднял я по 8ми значениям, без скольжения. Снимал около 20 чтоль значений. В ручном режиме, да… минут 10 затратил :)

      • 3acpaHeLL говорит:

        А что значит в ручном режиме? Не пойму как вышло 10 минут при усреднении 8 измерений и, полученных, 20 усредненных значениях. При 75 Гц на эту операцию ушло бы 2 секунды))Или я что то не понял? Вы ведь на МК делали усреднения?

Добавить комментарий