Physical Computing

Network and Information, Senshu Univ.

Menu
  • Home
  • Tips
  • About
  • admin

Month: October 2018

5 PWM

October 22, 2018
| No Comments
| Class materials

今回の講義の目的は、マイコンを使って電圧を制御することです。電圧を上げたり下げたりできると、LEDの光る強さを変えたり、モータの回転速度を変えたりすることができます。 ※10月25日の演習には、未使用の単3電池4本を持参してください。持ってきていない場合には、演習時間内に購入しに行ってもらいます。 目次 5.1 PWM 5.2 モータの基礎 5.3 実習 5.1 PWM マイコンの世界はデジタルなので、プログラムで電圧を制御するのは、ちょっと難しいことです。そこで、PWMという手法が登場します。 仕組み マイコンのデジタルピンからの出力は、HIGH(例えば3V)かLOW(例えば0V)のどちらかだけです。しかし、0Vから3Vまでの間の電圧を、自由に変えたいという場合があります。例えば、LEDの明るさを調整したい場合などです。こういう時には、PWM(Pulse Width Modulation)という方法を用います。 PWMの仕組みを一言で説明すると、HIGHとLOWを素早く切り替えることによって、HIGHとLOWの間の電圧を擬似的に作り出す方法です。以下の図をみてください。 このようにHIGHとLOWを規則的に繰り返す信号を、パルス波と言います。上記の図で示しているパルス波は、ある一定時間で同じパターンを繰り返していますね。このような繰り返しの間隔を周期と呼び、1秒間に何周期あるかを周波数と呼びます。周期の始まりは、LOWからHIGHに変わる瞬間で、周期の終わりは、次にLOWからHIGHに変わる瞬間です。周波数1kHzと言ったら、1秒間に1000回の周期が起こるような波形を意味します。 図で示したパルス波は、1周期におけるHIGH(3V)とLOW(0V)の間隔が、ちょうど1/2ずつになっています。周波数が十分に高い場合,このデジタルピンにかかる電圧は、3V / 2 = 1.5Vとなります。これがPWMです。実際に電圧を変えるのではなくて、擬似的に電圧を変えているのです。 PWMを使用する場合、どのくらいの周波数が必要かは難しい問題なので、あまり深入りしないことにしますが,1Hzではだめなことは明らかです。1Hzということは、HIGHとLOWが同じ時間であるとすると1周期内で0.5秒ずつです。LEDで実験すると単に点滅するだけです。PWMの周波数は、デジタルピンの用途によって変わるとされています。例えばLEDを使う際に必要な周波数,モータを使う際に必要な周波数という具合です。モータの場合には10kHzから20kH位が適当でしょう。LEDだと、数100Hzでも大丈夫だと思います。 PWMを使った場合にデジタルピンにかかる電圧は,デューティ比(duty ratio) によって決まります。デューティ比とは,1周期の間にHIGHになっている割合のことです。HIGHが3Vの場合、デューティ比50%ならば1.5V,10%ならば0.3Vとなります。 PWMを使って電圧を制御するには、パルス波を作り出す必要があります。パルス波は、タイマを使って作ります。非常に微小な時間をタイマによって作りだし,デジタル出力をHIGHにしたりLOWにしたりします。例えば、1kHzの周波数でPWM 制御をしたいとしましょう。1秒間に1,000周期ですから,1周期は1msです。1周期を10段階に分けると、1段階100µsになります。この100µsをタイマを使って作り1単位とすれば、10%刻みでデューティ比が設定できるようになります。 試してみよう mbedの基本ライブラリには、PWMを簡単に使うためのPwmOutというクラスが用意されています。よって、自分でタイマを使って波形を作る必要はありません。ただし、PwmOutに指定できるピンは決まっています。以下のURLで確認してください。紫色で”PWM何とか”と書いてあるピンが使えるピンです。 https://os.mbed.com/platforms/ST-Nucleo-F303K8/ ソース電流を使った回路でLEDを光らせることを考えます。定電流ダイオードではなくて330Ωの抵抗を使っていることに注意してください。 以下のようなプログラムを作成して、実行します。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "mbed.h"
 
PwmOut pwm(D12);
 
int main() {
    pwm.period_ms(1);
    while(1) {
        pwm = 0.2;     // 20%
        wait(1);
        pwm = 1.0;     // 100%
        wait(1);
    }
}
 

LEDをよく見ていると、1秒ごとに光る強さが変わるのが観察できるはずです。暗い時にはPWMのデューティ比は20%になっています。 myled.period_ms(1);に注目してください。これは、PWMの周期を、1msの幅に設定しています。1周期が1msということは、1kHzということですね。それでは、これを100msにしたら、どうなるでしょうか。これは、演習で実際に実験することにしましょう。 デューティ比を変化させてLEDの明るさを連続して変化させて見ましょう。

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
#include "mbed.h"
 
#define BRIGHTNESS_MAX 100
#define BRIGHTNESS_MIN 0
 
PwmOut myled(D12);
 
int main() {
    int brightness = 20;     // initial brightness value
    int increment = 5;
    myled.period_ms(1);
    while(1) {
        brightness += increment;
        if(brightness > BRIGHTNESS_MAX) {
            brightness = BRIGHTNESS_MAX;
            increment = -increment;
        }
        else if(brightness < BRIGHTNESS_MIN) {
            brightness = BRIGHTNESS_MIN;
            increment = -increment;
        }
        myled = brightness / 100.0;
        wait(0.1);
    }
}
 

LEDの明るさが滑らかに変わることが観測されるはずです。 PWMを使う際にもう1つ頭に入れておいて欲しいことがあります。それは、デューティ比を変化させる際には少し間隔をおく必要があるということです。5msくらいあれば大丈夫だと思います。上記の例ではwait(0.1)で100msの間隔を空けています。 ピン配置 F303K8とmbed OSを使ってPWMを使う時には少し注意が必要です。F303K8のピンの説明図を見ると、17個のピンがPWMに使えることがわかります。 ただし、この17個が全て同時に使えるかというとそういうわけではありません。上記図の紫色で示されているPWMの名前ですが、PWMn/c[N]という形式になっていてnはタイマの番号、cはチャネルとなっています。[N]はNがついたりつかなかったりなのですが、無視して良いです。このPWMの名前が同じものは、一緒には使えません。例えば、D6とD7はともにPWM1/3Nです。ということはD6とD7はいつも同じ動きをするということです。同様にD11とA6もPWM17/1という同じPWMの名前です。 PWMの名前を表にまとめると以下のようになります。この図で色がついているピンは注意が必要です。同じ色がついているピンは同時には使えません。 これを見ると、同時に使えるPWMは最大13個であることがわかります。 5.2 モータの基礎 この講義では、DCモータとサーボモータという2種類のモータを使います。 DCモータ 家庭にある電源コンセントを、AC100Vと呼ぶことは知っていると思います。このACとはAlternating Currentの略で、電流の向きが変わることを意味しています。日本語では、交流あるいは交流電流と言います。 一方、乾電池やUSB電源などは、直流あるいは直流電流と呼ばれます。DCというのは、Direct Currentの略で、直流電流を意味します。直流の場合、電流の向きは常に一定です。 […]

Read More »

Posted in Class materials

4 Digital Input

October 15, 2018
| No Comments
| Class materials

今回の講義の目的は、外部から情報をマイコンで受け取る方法をマスターすることです。ただし、今回扱うのはデジタル信号です。具体的には、スイッチが押されたことをマイコンで検知する、ということをやります。 目次 4.1 スイッチ 4.2 デジタル入力 4.3 チャタリング 4.4 実習 4.1 スイッチ スイッチというのは、電線を連結したり、切断したりするためのデバイスです。ボタンということもあります。スイッチは、様々な種類が存在しますが、よく使うものはタクトスイッチと、トグルスイッチです。 タクトスイッチ(tactile switch)とは、通常ボタンの形状をしていて、押すと電線が連結され、離すと切断されます。 写真のタクトスイッチはとても小さくて、5ミリ角くらいです。このタイプのものは、そのままブレッドボードに差し込んで使うことができます。 足が4つ付いていますね。これらの足は、2つずつの2グループに分かれていて、同一のグループに属する足は、常に通電されています。どの足とどの足が繋がっているかは、背面にマークがあることが多いです。写真の製品の場合には、背面に線が書いてあって、繋がっている足がわかります。マルチメータを使ってどの足とどの足が通電しているか確認しておきましょう。 タクトスイッチが押された時にLEDが光る回路は以下のようになります。電源と抵抗の間にあるのが、タクトスイッチの記号です。 タクトスイッチをブレッドボードに刺す時には以下のように真ん中の仕切りをまたぐようにすると良いでしょう。 トグルスイッチ(toggle switch)とは、電線の連結と切断を切り替えられるようにしてあるスイッチです。どちらかを選択すると、他を選択し直すまで同じ状態を保ちます。 スイッチの電子部品記号は、いくつかあります。この講義では以下の2つを使います。 おまけとして、ディップスイッチの写真も載せておきます。これは、複数のトグルスイッチが1つのパッケージになったものです。 4.2 デジタル入力 スイッチの状態を感知するというのは、マイコンにとってはデジタル信号の入力を行うことです。ピンにかかる電圧は3.3Vか0Vのどちらかになり、3.3Vならば1、0Vならば0という数値で認識します。デジタル入力には、デジタル出力と同様にD0からD13までが使用できます。 スイッチは、直感的にわかりやすいデバイスですが、マイコンへの入力として使うときには少し注意が必要です。以下のように回路を作ると、タクトスイッチが押されたかどうかをマイコンで検知できそうに思いますよね。D12というラベルが付いている記号はF303K8のD12ピンです。 しかし、これはやってはいけません。タクトスイッチが押されているときにはD12が3.3Vにつながりますから正しく検知できます。しかし、タクトスイッチが離されているときには、D12はどこにも繋がっていない状態になります。このような状態を、ピンがオープンになっていると言い、マイコンのピンでは電圧が測定できません。 また、以下のような回路もよく見られる間違いです。 この回路では、3.3Vとグランドがショートしてしまうので大変危険です。3.3Vをマイコンボードからとっている場合には、マイコンボードが破損する恐れがあります。 正しくは以下のような回路を組みます。 D12をデジタル入力として使用する際には、マンコンの中では以下のようなことが行われています。これはピンをデジタル入力として使う場合で、前回実験したデジタル出力の場合には当てはまりません。 D12をデジタル入力とすると非常に大きな抵抗を介してグランドに接続されます。図では仮に3MΩ(メガオーム)としています。このような状態をハイインピーダンスと呼びます。D12では、マイコンがこの大きな抵抗にかかる電圧を計測しています。 この例では、10KΩの抵抗と3MΩの抵抗は並列に接続されていますね。並列に接続されているということは、どちらにも同じ電圧がかかるということです。タクトスイッチが押されると、並列回路の部分に3.3Vの全てがかかるはずです。よって、D12では3.3Vが計測されます。タクトスイッチが離されている時には、D12はGNDとGNDの間の電圧を測ることになりますから0Vになるわけです。 このような回路をプルダウン回路と呼び、10KΩの抵抗をプルダウン抵抗と呼びます。 プルダウン回路とは逆に、タクトスイッチが離されている時に3.3Vが計測され、押されている時に0Vとなる回路も作れます。 これをプルアップ回路と呼び、10KΩの抵抗をプルアップ抵抗と呼びます。この場合、スイッチが離されている時に3.3Vが計測されます。 今度は、以下の図のように考えます。 タクトスイッチが押されていない状態では直列回路です。10KΩにかかる電圧と3MΩにかかる電圧の和が3.3Vになります。こういう回路を分圧回路と呼ぶのですが、これはもう少し先の回で説明したいと思います。ここでは、10KΩと3MΩの差があまりにも大きいので、3.3Vのほとんどが3MΩの方にかかることになる、としておきます。 タクトスイッチが押された状態では直列回路と並列回路の組み合わせです。並列回路になっている抵抗は3MΩとタクトスイッチです。タクトスイッチはほぼ0Ωと思って良いはずですね。この2つの抵抗を組み合わせた抵抗値を求めてみましょう。 1/R = 1/R1 + 1/R2 R1が0Ω、R2が3MΩです。1/R1はほぼ無限大ですから、1/R1 + 1/R2もほぼ無限大です。ということは、Rはほとんど0Ωだということです。よって、10KΩに3.3Vのほぼ全てがかかり、3MΩにかかる電圧は0Vです。 スイッチの応用例 それでは実際に回路を作って試してみましょう。プルダウン回路にしてみます。回路図は、前の章で説明したものを参照してください。 プログラムは、以下の通りです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "mbed.h"
 
DigitalIn mytactile(D12);
Serial pc(USBTX, USBRX); // tx, rx
 
int main() {
    while(1) {
        if(mytactile.read() == 1) {
            pc.printf("high\n");
        }
        else {
            pc.printf("low\n");
        }
        wait(0.1);
    }
}
 

PC側で、ターミナルを起動して、シリアル通信の結果を表示できるようにしてください。タクトスイッチを押すと、以下のような結果が得られるはずです。 DigitalIn mytactile(D12);は、D12でデジタル信号の入力を待つための宣言です。mytactile.read()で、その時のD12の状態を読み取っています。この結果は1か0ですから、それに応じて”high”か”low”を出力します。 […]

Read More »

Posted in Class materials

3 Digital Output

October 8, 2018
| No Comments
| Class materials

今回の講義の目的は、マイコンの使い方を理解することと、デジタルピンの使い方をマスターすることです。 3.1 マイクロコントローラの基礎 3.2 mbed OS 3.3 実習 3.1 マイクロコントローラの基礎 まず、マイコンについて基本的なことを説明しておきます。マイコンは、一般に以下の写真のような見た目をしています。 写真のマイコンは、細長い形をしていて両側に足が出ていますが、形状はいろいろなものが存在します。多くの場合、黒いプラスティックのパッケージになっています。このプラスティックのパッケージの中に、マイコン本体が封入されています。よって、マイコン本体は、もっと小さなものです。 マイコンからは、ゲジゲジの足のようなものが出ています。これをピン(pin)、あるいは端子と呼びます。マイコンは、このピンを通じて電源供給を受けたり、他の部品と連携したりします。 F303K8のマイコンボードを見ると、5mm四方ほどの黒い正方形のマイコンが実装されているのがわかります。 ピンが四方についていますが、ものすごく小さくてプロトタイプを作る際には使いづらいことが多いです。そのため、マイコンボードは、ピンから配線を延ばしてブレッドボードに差し込みやすいような形状にしているのです。実際の製品にするときには、マイコンボードは使わずに、よりコンパクトな基盤にすることが多いです。 マイコンボード 以下のリンクをみてください。これは、mbedの公式Webサイト内でF030K8ボードの紹介をしているページです。 https://os.mbed.com/platforms/ST-Nucleo-F303K8/ このWebページはとても重要ですから、からなずブックマークなどをして、すぐにアクセスできるようにしておきましょう。特に以下の図が重要です。 この図は、F303K8のピン配置図です。どの場所に、どういう機能のピンがあるのかを説明した地図のようなものです。幾つか重要なピンに関して説明しておきます。 5V: このピンにはUSBから供給される5Vが来ています。他の電子部品に5Vを供給したいときには、ここを電源とします。 3V3: このピンには3.3Vの電圧がかかっています。他の電子部品に3.3Vを供給したい時には、ここを電源とします。 VIN: このピンからマイコンに直接電源を供給することができます。USBから電源が供給されているときには、このピンに3.3Vがかかっています。この演習ではこのピンは使いません。 GND: グランド、つまりマイナスです。 D0からD13、A0からA7と書かれているピンは、いろいろな用途に使うことができます。DはデジタルをAはアナログを意味します。今日はD0からD13までのピンを使います。 STMicroelectronics NUCLEO-F303K8 ここで、F303K8ついて、もう少し説明しておきます。このマイコンボードにはSTM32F303K8T6というマイコンが使われています。このマイコンは、ARM社が設計したCortex-M4というアーキテクチャがベースとなっています。以下のような特徴があります。 32bitマイコン フラッシュメモリ: 64kB SRAM: 16kB 動作クロック: 72MHz フラッシュメモリは、プログラムを格納する場所です。SRAMは、プログラム中で使用する配列や変数を格納する場所です。 SRAMは16kBしかありません。皆さんが使っているMacBook Airには4GBか8GBのメモリが搭載されています。あまりにも桁違いの大きさですね。 16kBががどのくらいの大きさなのかというと、日本語の文字で8000文字分です。英字アルファベットならば16000文字分、16bitの整数だと8000個分ということになります。ちなみに、mbedのint型は32bitですから、4000個分しか入りません。つまり4000個の整数が格納できる配列は宣言できない、ということになります。実際には3000個分くらいが限界でしょう。 mbedには、他にも様々なハードウェアプラットフォームがあり、F303K8はコンパクトな方です。他のハードウェアには、もっと多くのRAMが搭載されていたりします。 STM32F303K8T6に関して、もっと詳細なデータが知りたければ、データシート(datasheet)というものを参照します。STM32F303K8T6のデータシートは、以下の場所にあります。ただし、マイコンのデータシートを読むのは難しいので、当面は無視しておいて構いません。 http://www.st.com/en/microcontrollers/stm32f303k8.html デジタル信号・アナログ信号 D0からD13まではデジタルピンと呼ばれるピンで、デジタル信号の入出力に使います。実際には他のピンもデジタル信号の入出力に使えるのですが、とりあえずD0からD13までに限定して考えます。出力として使う場合には、プログラムでデジタルピンにかかる電圧を0Vにするのか3.3Vにするのかを決められます。入力として使う場合には、プログラムでデジタルにかかっている電圧によって0か1かの値を得ることができます。 A0からA7まではアナログピンと呼ばれるピンで、アナログ信号の入力に使います。場所によっては、アナログ信号の出力にも使えますが、それは別の機会に説明します。 F303K8のピン配置図を見るとD0にはPA_10、D1にはPA_9といった具合に、もう1つ名前がつけられています。これらの名前もD0やD1と同じように使うことができます。 電気の世界における信号とは、時間とともに変化する電圧によって情報を表すことです。デジタル信号とは、2つの電圧によって0と1を表現したもので、例えば、0Vが0で3.3Vが1のように表現します。以下の図では、0VとxVで説明しています。 実際の電子回路では、0を1V未満、1を3V以上のように、ある境界(閾値)を定めて判断しています。しかし、今は、そこまで意識する必要はありません。 アナログ信号の場合には、電圧の大きさで何かの大きさや量を表現します。例えば、部屋の明るさの場合には、光量を知りたいですよね。陽が昇れば徐々に明るくなり、陽が暮れれば徐々に暗くなります。夜中に電気をつければ突然明るくなったりもします。その時の部屋の明るさを光センサを使って計測すると、電圧の変化に変換して教えてくれます。 Digital Output […]

Read More »

Posted in Class materials

2 Let’s Play with LED

October 4, 2018
| No Comments
| Class materials

今回の講義の目標は、LEDを光らせることです。電子回路がどういうものかのかを体感してみましょう。 目次 2.1 電子回路 2.2 デバイス 2.3 LED 2.4 実習 2.1 電子回路 この講義では、マイコンボードを中心にした電子回路(electronic circuit)を作っていきます。電子回路とは何か、ということはあまり難しく考えないことにしましょう。ここでは、様々な電子部品を電線で結んだものとしておきます。当然、電気を流します。 もう少し正確に言うと、電子部品に電圧をかけて電流を流すということになります。電子部品は、電流が流れて初めて仕事をしてくれます。小学校の時に、豆電球を光らせる実験をしたことと思います。あれです。電流はプラス極からマイナス極に流れます。電線をうまくつなぐことで、電子回路を作ります。 電圧と電流 電圧の強さは、ボルト(V)という単位で表します。電流の量は、アンペア(A)という単位で表します。一般的に、電圧を強くすればするほど、電流は多く流れます。1.5Vの電池1つで豆電球を光らせるより、2つの電池を直列につないで3Vにした方が、豆電球は明るく光るのでしたよね。 しかし、電流を阻害するものがあります。それが抵抗です。プラスとマイナスの間に繋がれた抵抗が大きくなればなるほど、流れる電流は少なくなります。抵抗の大きさは、オーム(Ω)という単位で表します。 電圧と電流と抵抗の間には、有名なオームの法則という関係が成り立っています。電圧をE、電流をI、抵抗をRで表した時、以下の関係が成り立っています。 E = R×I これは式の変形を行うと、以下のようにも表せます。 I = E/R 多くの場合、電圧は決まっていて抵抗を使って電流を制御することになるので、I = E/Rの方が直感的に理解しやすいですね。つまり、抵抗R(分母)を大きくすればするほど、電流Iは小さくなります。 では、逆にRをどんどん小さくしていくと、どんなことが起こるのでしょうか。Rが0に近づくと、Iは無限大に近づいていきます。電池のプラス極とマイナス極を電線で直接結ぶと、ちょうどこのような状況になります。電線自体にもわずかながら抵抗はあるのですが、とても小さいです。このような時、回路は短絡している、あるいはショートしているといいます。ショートすると大量の電流が電子回路に流れ、電子部品は破壊され、電池は熱を発して最悪の場合発火したり爆発したりします。特にリチウムイオン充電池を使っている場合には非常に危険です。 回路は絶対にショートさせてはいけません! ショートさせないためには、適切な場所に適切な大きさの抵抗を入れる必要があります。 直列回路と並列回路 回路には、直列回路(serial circuit)と並列回路(parallel circuit)があります。豆電球の例で考えましょう。豆電球を直列につなぐとは、以下のようにすることです。 豆電球は、光を発する抵抗だと考えましょう。よって、回路はショートしていません。 並列につなぐとは、以下のようにすることです。 豆電球を直列でつなぐのと、並列でつなぐのとでは、どのような違いがあったか思い出しましょう。 直列につなぐと、豆電球を1つだけつないだ時よりも暗く光ります。 並列の場合には、1つの時と明るさが変わりません。 電池の持ちは、直列の場合には豆電球を1つだけつないだ時と同じですが、並列の場合には早く無くなってしまいます。 2つの抵抗を直列につないだ場合、全体の抵抗値は2つの抵抗値の合計になります。豆電球の場合も同じで、1つつなぐよりも2つつないだ方が、より抵抗が大きくなります。抵抗が大きいのですから、オームの法則から計算できるように、回路全体を流れる電流は小さくなります。よって、豆電球は弱く光ります。同じ豆電球を2つ直列につないだ場合、それぞれの豆電球にかかる電圧は、電池の電圧の1/2となります。 2つの抵抗を並列につないだ場合は、少し複雑です。まず、電圧から考えます。並列回路の場合には、2つの豆電球それぞれにかかる電圧は等しくなります。この場合では、電源の電圧と、2つの豆電球それぞれにかかる電圧は同じです。つまり、局所的に見ると、豆電球1つを1つの電池につないだ時と同じ電圧・電流が、それぞれの豆電球に与えらえることとなります。よって、明るさは1つの時と2つの時で変わりません。 今度は、回路全体の抵抗を考えます。2つの豆電球の抵抗値を、それぞれR1、R2と呼ぶことにしましょう。並列に繋いだ部分全体の抵抗値をRとします。 この時、RとR1、R2の間には以下のような関係が成り立ちます。 1/R = 1/R1 + 1/R2 今、R1とR2がそれぞれ200Ωだったとしましょう。すると1/R = 2/200となり、Rは100Ωだということが分かります。 1つの豆電球を繋いだ時の抵抗値が200Ωに対して、2つの豆電球を並列に繋いだ時の抵抗値が100Ωになるということです。何だか不思議ですね。その結果、回路全体に流れる電流は、豆電球1つの場合よりも2つの場合の方が多くなります。結果、電池の減りが早くなります。 […]

Read More »

Posted in Class materials

Recent Posts

  • NE22の学生さんたちへ
  • 13 発表会
  • 12 発表準備
  • 11 実装
  • 10 要素テスト

Archives

  • July 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • January 2018
  • December 2017
  • November 2017
  • October 2017
  • September 2017
  • July 2017
  • January 2017
  • December 2016
  • November 2016
  • October 2016
  • September 2016

Categories

  • Announcement
  • Class materials
  • Tips
  • Uncategorized

Meta

  • Log in
  • Entries RSS
  • Comments RSS
  • WordPress.org

Physical Computing 2023 | Powered by WordPress.