Электронный компас на 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 магнитометра.
 

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

 

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

171 thoughts on “Электронный компас на LSM303DLH”

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

      1. А обычный компас у тебя дома тоже скачет как полоумный? Конечно от магнита он сбесится. Но уже в 20-30см от ниодимого магнита он его перестает чувствовать вообще.

    1. 1. Магнит от винта перестает замечать уже за 20-30см.
      2. Вертеться вообще не надо. Разве что для калибровки. Но это делается один раз.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                    ———————

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

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

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

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

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

            2. гражданин, вы только не обижайтесь, но покоящийся акселерометр показывает 1g по оси Z. А гироскопы показывают угловые скорости («покоящийся» гироскоп с хорошим чутьём покаждет вращение Земли.. ну, или где вы там находитесь). Всегда ваш, К.О.

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

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

      1. гироскоп lpr530al
        АЦП ads1255
        и еще стабилизатор на 3.3В в соик8 который на момент фотографирования был выпаян :)

        Есть еще аналогичная платка где такой же гироскоп подключен напрямую к меге16

    1. Фильтрация по частотам. Например если взять скользящим средним за секундный период, то мы получим четко ориентацию, а вибрация вся уйдет.

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

        1. У ST в первом квартале 2011 будет цифровой трехосный гироскоп, скорее всего весьма дешевый. Пытался раздобыть сэмплы, но пока не получилось. У аналога есть привлекательные по характеристикам модели, но цены у них конечно уже другого порядка. Вообще, если интересно, можно обменяться координатами, для более продуктивной работы. Я своим проектом в феврале скорее всего весьма плотно займусь, сейчас просто времени нет.

          И еще, по ссылке немного обсуждений про ту модель что я использовал и про гироскопы в общем, в основном речь про фильтры
          http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=659785
          на английском правда

            1. Посмотрел по сайтам, действительно появился в продаже. Это при том что на него до сих пор нормального даташита нет. Странно это все. Цена вполне ожидаемая кстати.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    1. Еще не считал. Я текущую программу то до ума еще не довел, чтобы на плоскости нормально углы ловила. А с наклонами там надо проекции векторов делать, раскладыывая их по составляющим тройкам.

        1. Неа, все расписаны уже. Но через месяц мне еще приедет парочка тогда можно.

          Ну либо сам закажи в elitan.ru
          вот тебе еще код моей дисконтной карты на 5% скидку 0000 0211 8032 3127

        1. Так там не делителем единым. Там и i2c интерфейсы от этого же питаются. Я потому и поставил туда линейник.

          1. Знаю, для этого туда нормальный преобразователь интерфейсов поставил adg3308 пришлось правда повозиться с разводкой что бы не шумел.

          1. Понял ) Я сейчас с фильтрацией гироскопа и акселерометра работаю. Под фильтрацией данных магнитометра я имею ввиду калибровку и различные виды усреднений. Какие лучше — эксперимент покажет

          1. Ну а ты как хотел. За морем телушка — полушка. Да рупь перевозка. Зато доедет каким нибудь DHL до двери дня за три :)

            Тебя еще на растаможку могут натянуть :) Оттуда имеет смысл дергать только оптом, сразу штук по 100-200

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

    1. Азимутальная характеристика всегда круг. А всякие подмагничивания смещают центр этого круга от 00

      Пока опыты не проведу (все некогда) точно сказать не смогу ничего.

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

    1. Т.е. и интерфейсные и выводы магнитометра запитал от 3.3 вольт? Т.е. источник на 1.8 вольт не применялся совсем?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      1. уже похоже на правду:
        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 из архива, в надежде, что там все ОК ;)

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

        Спасибо!

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

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

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

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

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

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

    1. Да адресные пины делаешь разные и все. Ну и обращаешься в результате по разным адресам.

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

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

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

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

    1. Я — ни для каких. С того поста я к нему не возвращался. Испытал, написал статью и пример кода и отложил в сторонку.

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

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

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

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

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

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

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

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

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

  28. При работе с магнитометром после нескольких циклов опроса он начинает отправлять 0х20 по всем осям. Акселерометр при этом работает нормально. Повторная инициализация магнитометра ни к чему не приводит, помогает только включение/выключение питания. Схема подключения как в статье. Контроллер ATMega48PA. I2C 50 кГц. Непрерывные преобразования включены у магнитометра, частота обновления 75Гц. В чём может быть причина?

  29. Здравствуйте DI!
    Извините что повторяюсь (вопрос был задан на ветке AVR. Учебный курс. робота с шиной I2C)
    Возникло желание (необходимость) подключить и разобраться с LSM303DHL .
    С протоколом как бы понятно.
    Но где мы берем адрес ведомого устройства?
    Простите новичка!
    С ув.

  30. Доброго дня суток, может мой вопрос вам покажется глупым но объясните новичку, почему поворачивая датчик на 45 градусов синусоиды сдвигаются на 90 градусов, а так же почему синусоида y выше синусоиды x. Заранее спасибо

    1. Где там сдвиг на 90 при 45? Синус двигается четко по градусам. А разница уровней скорей всего из-за подмагничивания чем либо, может дорожкой питающей. Может металл дороже влияет как то. Это константа и не особо мешает, вычесть ее и все.

  31. можна увидеть сигнал если вращать не в горизонтальной,а в вертикальных плоскостях ( вдоль север-юг и вдоль запад-восток ) ?какие полюса где?

    1. Магнитометр трехканальный, ортогональный. А поле Земли оно вектор направленный куда-то (на север, но там еще и угол к горизонту есть). Вот его проекции и снимают датчики. Так что в других плоскостях тоже что то можно поймать. Например склонение или как там его звать.

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

Ваш e-mail не будет опубликован.

Перед отправкой формы:
Human test by Not Captcha