VM

 https://howtomechatronics.com/projects/diy-vending-machine-arduino-based-mechatronics-project/#google_vignette

/*     DIY Vending Machine - Arduino based Mechatronics Project

    by Dejan Nedelkovski, www.HowToMechatronics.com

*/

#include <LiquidCrystal.h> // includes the LiquidCrystal Library
#include <Servo.h>

LiquidCrystal lcd(27, 26, 25, 24, 23, 22); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
Servo servo1, servo2, servo3, servo4;   // DS04-NFC motors

// Stepper motors pins
#define dirPinVertical 0
#define stepPinVertical 1
#define dirPinHorizontal 2
#define stepPinHorizontal 3

#define coinDetector 9

#define button1 13
#define button2 12
#define button3 11
#define button4 10

#define microSwitchV 15
#define microSwitchH 14

int buttonPressed;

void setup() {
  lcd.begin(16, 2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display

  servo1.attach(4);
  servo2.attach(5);
  servo3.attach(6);
  servo4.attach(7);

  pinMode(dirPinVertical, OUTPUT);
  pinMode(stepPinVertical, OUTPUT);
  pinMode(dirPinHorizontal, OUTPUT);
  pinMode(stepPinHorizontal, OUTPUT);

  pinMode(coinDetector, INPUT);

  // Activating the digital pins pull up resistors
  pinMode(button1, INPUT_PULLUP);
  pinMode(button2, INPUT_PULLUP);
  pinMode(button3, INPUT_PULLUP);
  pinMode(button4, INPUT_PULLUP);

  pinMode(microSwitchV, INPUT_PULLUP);
  pinMode(microSwitchH, INPUT_PULLUP);

  // Vertical starting position
  digitalWrite(dirPinVertical, HIGH); // Set the stepper to move in a particular direction
  while (true) {
    if (digitalRead(microSwitchV) == LOW) { // If the micro switch is pressed, move the platfor a little bit up and exit the while loop
      moveUp(70);
      break;
    }
    // Move the carrier up until the micro switch is pressed
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
  // Horizontal starting position
  digitalWrite(dirPinHorizontal, LOW);
  while (true) {
    if (digitalRead(microSwitchH) == LOW) {
      moveLeft(350);
      break;
    }
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
}
void loop() {
  // Print "Insert a coin!" on the LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Insert a coin!");
  
  // Wait until a coin is detected
  while (true) {
    if (digitalRead(coinDetector) == LOW) { // If a coin is detected, exit the from the while loop
      break;
    }
  }
  
  delay(10);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Select your item");
  lcd.setCursor(0, 1);
  lcd.print(" 1, 2, 3 or 4?");
  
  // Wait until a button is pressed
  while (true) {
    if (digitalRead(button1) == LOW) {
      buttonPressed = 1;
      break;
    }
    if (digitalRead(button2) == LOW) {
      buttonPressed = 2;
      break;
    }
    if (digitalRead(button3) == LOW) {
      buttonPressed = 3;
      break;
    }
    if (digitalRead(button4) == LOW) {
      buttonPressed = 4;
      break;
    }
  }
  
  // Print "Delivering..." 
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Delivering...");
  
  // Depending on the pressed button, move the carrier to that position and discharge the selected item 
  switch (buttonPressed) {
    case 1:
      // Move the container to location 1
      moveUp(4900); // Move up 4900 steps (Note: the stepper motor is set in Quarter set resolution)
      delay(200);
      moveLeft(1700); // Move left 1700 steps
      delay(300);
      // Rotate the helical coil, discharge the selected item
      servo1.writeMicroseconds(2000); // rotate
      delay(950);
      servo1.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(4900);
      break;
      
     case 2:
      // Move the container to location 2
      moveUp(4900);
      delay(200);
      // Rotate the helix, push the selected item
      servo2.writeMicroseconds(2000); // rotate
      delay(950);
      servo2.writeMicroseconds(1500);  // stop
      delay(500);
      moveDown(4900);
      break;

      case 3:
      // Move the container to location 3
      moveUp(2200); 
      delay(200);
      moveLeft(1700);
      delay(300);
      // Rotate the helix, push the selected item
      servo3.writeMicroseconds(2000); // rotate
      delay(950);
      servo3.writeMicroseconds(1500);  // stop
      delay(500);
      // Move the container back to starting position
      moveRight(1700);
      delay(200);
      moveDown(2200);
      break;

      case 4:
      // Move the container to location 4
      moveUp(2200); // Move verticaly 4800 steps
      delay(200);
      // Rotate the helix, push the selected item
      servo4.writeMicroseconds(2000); // rotate
      delay(950);
      servo4.writeMicroseconds(1500);  // stop
      delay(500);
      moveDown(2200);
      break;
  }
  
  lcd.clear(); // Clears the display
  lcd.setCursor(0, 0);
  lcd.print("Item delivered!"); // Prints on the LCD
  delay(2000);
}

// == Custom functions ==

void moveUp (int steps) {
  digitalWrite(dirPinVertical, LOW);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
}
void moveDown (int steps) {
  digitalWrite(dirPinVertical, HIGH);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
}
void moveLeft (int steps) {
  digitalWrite(dirPinHorizontal, HIGH);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
}
void moveRight (int steps) {
  digitalWrite(dirPinHorizontal, LOW);
  for (int x = 0; x < steps; x++) {
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
}Bahasa kode:  Arduino  ( arduino )
Explain

Penjelasan kode sumber

Pertama-tama kita perlu menyertakan pustaka Servo dan LiquidCrystal, menentukan pin LCD, empat motor servo, pin motor stepper, detektor koin, serta empat tombol dan dua sakelar mikro.

Di bagian pengaturan, kami mengatur mode pin untuk setiap pin yang disebutkan di atas. Kami dapat mencatat bahwa untuk tombol dan pin sakelar mikro, kami mengaktifkan resistor pull up internal. Ini berarti bahwa level logika pada pin ini akan selalu TINGGI, dan setelah kami menekannya, level logika akan turun ke RENDAH.

Sebelum kita memasuki loop utama, kita juga mengatur pembawa ke posisi awalnya yang ditentukan oleh dua sakelar mikro. Jadi dengan loop while kita terus menggerakkan pembawa ke posisi awalnya dan begitu dua sakelar mikro ditekan, motor akan berhenti dan bergerak ke posisi awal yang diinginkan.

Bahasa Ezoik
// Vertical starting position
  digitalWrite(dirPinVertical, HIGH); // Set the stepper to move in a particular direction
  while (true) {
    if (digitalRead(microSwitchV) == LOW) { // If the micro switch is pressed, move the platfor a little bit up and exit the while loop
      moveUp(70);
      break;
    }
    // Move the carrier up until the micro switch is pressed
    digitalWrite(stepPinVertical, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinVertical, LOW);
    delayMicroseconds(300);
  }
  // Horizontal starting position
  digitalWrite(dirPinHorizontal, LOW);
  while (true) {
    if (digitalRead(microSwitchH) == LOW) {
      moveLeft(350);
      break;
    }
    digitalWrite(stepPinHorizontal, HIGH);
    delayMicroseconds(300);
    digitalWrite(stepPinHorizontal, LOW);
    delayMicroseconds(300);
  }
========================================================================
Berikut adalah estimasi biaya komponen yang diperlukan untuk membuat mesin penyimpanan HP dengan fungsi vending machine menggunakan Arduino Uno. Harga-harga ini adalah perkiraan dan bisa bervariasi tergantung pada tempat dan penyedia yang Anda gunakan.

### 1. **Arduino Uno**  97
- **Harga:** $10 - $25

### 2. **Layar Sentuh TFT** 195
- **Harga:** $15 - $40

### 3. **Barcode Scanner**
- **Harga:** $30 - $60

### 4. **Printer Barcode**
- **Harga:** $50 - $100

### 5. **Solenoid Lock** 54
- **Harga:** $10 - $20 per unit (kali jumlah laci)

### 6. **Motor Servo**
- **Harga:** $5 - $20 per unit (tergantung kebutuhan mekanisme vending)

### 7. **Sistem Pembayaran**
- **Modul RFID atau Pembayaran Berbasis Kartu:** $15 - $50

### 8. **Komponen Lain**
- **Breadboard:** $5 - $10
- **Kabel Jumper:** $5 - $10
- **Resistor dan Kapasitor:** $5 - $10
- **Modul Relay:** $5 - $15
- **Power Supply:** $10 - $30

### 9. **Struktur dan Bahan Tambahan**
- **Lemari/Boks Penyimpanan:** $100 - $300 (tergantung bahan dan ukuran)
- **Bahan untuk Laci:** $50 - $100
- **Mekanisme Vending (rak, motor, dll.):** $50 - $100

### Total Estimasi Biaya

- **Arduino Uno:** $20
- **Layar Sentuh TFT:** $30
- **Barcode Scanner:** $45
- **Printer Barcode:** $75
- **Solenoid Lock (misalnya 10 laci):** $150
- **Motor Servo (misalnya 2 unit):** $30
- **Sistem Pembayaran:** $30
- **Komponen Lain:** $30
- **Struktur dan Bahan Tambahan:** $250

**Total:** $660

### Catatan

1. **Variasi Harga:** Harga dapat bervariasi tergantung pada pemasok, wilayah, dan kualitas komponen.
2. **Komponen Bekas:** Menggunakan komponen bekas atau daur ulang bisa mengurangi biaya.
3. **Pengiriman dan Pajak:** Jangan lupa untuk mempertimbangkan biaya pengiriman dan pajak yang mungkin berlaku.
4. **Tambahan Fitur:** Menambahkan fitur tambahan seperti konektivitas internet, lebih banyak laci, atau sistem keamanan yang lebih canggih akan menambah biaya.

Estimasi biaya ini adalah perkiraan dasar dan dapat disesuaikan sesuai dengan spesifikasi dan kebutuhan proyek Anda.

------------------------------------------------------------------------------------------------------------------
Berikut adalah skema dasar untuk menggabungkan mesin penyimpanan HP dengan vending machine menggunakan Arduino Uno. Skema ini mencakup komponen utama seperti sensor barcode, solenoid locks, motor servo untuk mekanisme vending, dan layar sentuh.

### Komponen yang Dibutuhkan

1. **Arduino Uno**
2. **Layar Sentuh TFT**
3. **Barcode Scanner (misalnya, scanner USB yang dapat dihubungkan dengan Arduino melalui konverter USB ke serial)**
4. **Printer Barcode (misalnya, printer thermal yang dapat dihubungkan dengan Arduino)**
5. **Solenoid Lock (untuk laci penyimpanan HP)**
6. **Motor Servo (untuk mekanisme vending)**
7. **Sistem Pembayaran (misalnya, modul RFID atau sistem pembayaran berbasis kartu)**
8. **Komponen Lain:**
   - Breadboard
   - Kabel jumper
   - Resistor dan kapasitor sesuai kebutuhan
   - Modul Relay (untuk mengendalikan solenoid lock dan motor servo)

### Skema Dasar

#### 1. **Sistem Penyimpanan HP**

1. **Layar Sentuh TFT:**
   - VCC ke 5V Arduino
   - GND ke GND Arduino
   - CS ke Pin 10 Arduino
   - RESET ke Pin 8 Arduino
   - DC/RS ke Pin 9 Arduino
   - MOSI ke Pin 11 Arduino
   - SCK ke Pin 13 Arduino
   - LED ke 3.3V Arduino
   - MISO ke Pin 12 Arduino

2. **Barcode Scanner:**
   - VCC ke 5V Arduino
   - GND ke GND Arduino
   - RX ke TX Arduino (melalui konverter USB ke serial)
   - TX ke RX Arduino (melalui konverter USB ke serial)

3. **Printer Barcode:**
   - VCC ke 5V Arduino
   - GND ke GND Arduino
   - TX ke RX Arduino
   - RX ke TX Arduino

4. **Solenoid Lock:**
   - VCC ke 12V (melalui relay)
   - GND ke GND Arduino
   - Kontrol ke Pin 7 Arduino (melalui relay)

#### 2. **Sistem Vending**

1. **Motor Servo:**
   - VCC ke 5V Arduino
   - GND ke GND Arduino
   - Kontrol ke Pin 6 Arduino

2. **Sistem Pembayaran (misalnya, modul RFID):**
   - VCC ke 3.3V Arduino
   - GND ke GND Arduino
   - RST ke Pin 9 Arduino
   - SDA ke Pin 10 Arduino
   - MOSI ke Pin 11 Arduino
   - MISO ke Pin 12 Arduino
   - SCK ke Pin 13 Arduino

### Kode Arduino

Berikut adalah contoh kode sederhana untuk mengontrol sistem penyimpanan HP dan vending machine:

```cpp
#include <SPI.h>
#include <TFT.h>
#include <Servo.h>

#define CS 10
#define DC 9
#define RESET 8

TFT tft = TFT(CS, DC, RESET);
Servo servo;

int solenoidPin = 7;
int servoPin = 6;

void setup() {
  // Inisialisasi layar sentuh
  tft.begin();
  tft.background(255, 255, 255);
  tft.stroke(0, 0, 0);
  tft.setTextSize(2);
  
  // Inisialisasi barcode scanner dan printer barcode
  Serial.begin(9600);

  // Inisialisasi solenoid lock
  pinMode(solenoidPin, OUTPUT);
  digitalWrite(solenoidPin, LOW);

  // Inisialisasi motor servo
  servo.attach(servoPin);
  servo.write(0); // posisi awal
  
  // Tampilkan menu utama di layar sentuh
  tft.text("Simpan HP", 10, 10);
  tft.text("Ambil HP", 10, 40);
  tft.text("Beli Barang", 10, 70);
}

void loop() {
  // Penerimaan HP
  if (touchScreenPressed() && touchScreenX() < 100 && touchScreenY() < 30) {
    tft.text("Scan Barcode", 10, 100);
    // Kode untuk memindai barcode dan menyimpan HP
    // Misalnya, menggerakkan solenoid lock untuk membuka laci
    digitalWrite(solenoidPin, HIGH); // Buka laci
    delay(5000); // Tunggu 5 detik untuk penyimpanan HP
    digitalWrite(solenoidPin, LOW); // Kunci laci
    tft.text("HP Disimpan", 10, 130);
  }

  // Pengambilan HP
  if (touchScreenPressed() && touchScreenX() < 100 && touchScreenY() > 30 && touchScreenY() < 60) {
    tft.text("Scan Barcode", 10, 100);
    // Kode untuk memindai barcode dan mengambil HP
    // Misalnya, menggerakkan solenoid lock untuk membuka laci
    digitalWrite(solenoidPin, HIGH); // Buka laci
    delay(5000); // Tunggu 5 detik untuk pengambilan HP
    digitalWrite(solenoidPin, LOW); // Kunci laci
    tft.text("HP Diambil", 10, 130);
  }

  // Pembelian Barang
  if (touchScreenPressed() && touchScreenX() < 100 && touchScreenY() > 60) {
    tft.text("Pilih Barang", 10, 100);
    // Kode untuk memilih barang dan menggerakkan motor servo untuk mengeluarkan barang
    servo.write(90); // Pindahkan ke posisi mengeluarkan barang
    delay(5000); // Tunggu 5 detik untuk pengeluaran barang
    servo.write(0); // Kembali ke posisi awal
    tft.text("Barang Dibeli", 10, 130);
  }
}

boolean touchScreenPressed() {
  // Kode untuk mendeteksi apakah layar sentuh ditekan
  return true; // Placeholder
}

int touchScreenX() {
  // Kode untuk mendapatkan koordinat X dari layar sentuh
  return 0; // Placeholder
}

int touchScreenY() {
  // Kode untuk mendapatkan koordinat Y dari layar sentuh
  return 0; // Placeholder
}
```

### Penjelasan Kode

- **Inisialisasi Layar Sentuh:**
  Layar sentuh diinisialisasi dan menampilkan menu utama dengan tiga opsi: "Simpan HP", "Ambil HP", dan "Beli Barang".

- **Penerimaan HP:**
  Jika pengguna memilih opsi "Simpan HP", sistem akan memindai barcode dan menggerakkan solenoid lock untuk membuka laci penyimpanan HP.

- **Pengambilan HP:**
  Jika pengguna memilih opsi "Ambil HP", sistem akan memindai barcode dan menggerakkan solenoid lock untuk membuka laci sehingga pengguna bisa mengambil HP.

- **Pembelian Barang:**
  Jika pengguna memilih opsi "Beli Barang", sistem akan menggerakkan motor servo untuk mengeluarkan barang dari vending machine.

### Catatan

1. **Komunikasi Serial:** Pastikan barcode scanner dan printer barcode mendukung komunikasi serial dengan Arduino. Anda mungkin perlu menggunakan konverter USB ke serial jika diperlukan.

2. **Solenoid Lock dan Motor Servo:** Pastikan solenoid lock dan motor servo yang digunakan sesuai dengan tegangan dan arus yang dapat ditangani oleh Arduino dan modul relay.

3. **Layar Sentuh:** Sesuaikan dengan jenis layar sentuh yang digunakan. Library dan pin yang digunakan bisa berbeda tergantung pada model layar sentuh.

4. **Pemrograman Lanjutan:** Kode di atas adalah contoh sederhana. Untuk implementasi sebenarnya, Anda perlu menambahkan lebih banyak logika seperti validasi barcode, penanganan kesalahan, dan integrasi dengan sistem pembayaran.

Dengan skema dan kode ini, Anda dapat membuat mesin penyimpanan HP yang juga berfungsi sebagai vending machine menggunakan Arduino Uno.

----------------------------------------------------------------------------------------------------------------------------
Mengombinasikan mesin penyimpanan HP dengan vending machine dapat memberikan solusi yang lebih praktis dan multifungsi. Berikut adalah rancangan dasar untuk mesin penyimpanan HP yang juga berfungsi sebagai vending machine.

### 1. **Komponen Utama**

- **Lemari Penyimpanan:**
  - Bahan kokoh seperti besi atau aluminium.
  - Beberapa laci/kotak untuk penyimpanan HP yang bisa dikunci.

- **Sistem Barcode:**
  - Barcode scanner.
  - Printer barcode untuk mencetak barcode unik untuk setiap laci/kotak.

- **Sistem Elektronik:**
  - Mikrokomputer (misalnya Raspberry Pi atau Arduino).
  - Layar sentuh untuk antarmuka pengguna.
  - Modul komunikasi (Wi-Fi atau Bluetooth) untuk konektivitas.

- **Sistem Mekanisme Kunci:**
  - Solenoid locks atau elektromagnetik untuk mengunci dan membuka laci/kotak.

- **Sistem Vending:**
  - Rak barang yang berputar atau bergerak.
  - Mekanisme pengeluaran barang.
  - Sistem pembayaran (kartu kredit, uang tunai, atau e-wallet).

### 2. **Cara Kerja**

#### a. **Proses Penerimaan HP:**
1. Pengguna mendekati mesin penyimpanan.
2. Pada layar sentuh, pengguna memilih opsi "Simpan HP".
3. Mesin akan mencetak barcode unik yang berisi informasi laci/kotak yang kosong.
4. Pengguna menempelkan barcode ini pada HP mereka.
5. Pengguna menempatkan HP dalam laci/kotak yang ditunjuk oleh sistem.
6. Sistem mengunci laci/kotak tersebut dan menyimpan informasi barcode dalam basis data.

#### b. **Proses Pengambilan HP:**
1. Pengguna mendekati mesin dan memilih opsi "Ambil HP" pada layar sentuh.
2. Pengguna memindai barcode pada HP mereka menggunakan scanner barcode.
3. Sistem memverifikasi barcode dan membuka laci/kotak yang sesuai.
4. Pengguna mengambil HP mereka dan menutup laci/kotak.
5. Sistem menghapus informasi barcode dari basis data dan menandai laci/kotak sebagai kosong.

#### c. **Proses Pembelian Barang:**
1. Pengguna mendekati mesin vending.
2. Pada layar sentuh, pengguna memilih barang yang ingin dibeli.
3. Pengguna melakukan pembayaran melalui sistem pembayaran yang tersedia.
4. Sistem mengeluarkan barang yang dipilih melalui mekanisme pengeluaran barang.
5. Pengguna mengambil barang dari slot pengeluaran.

### 3. **Diagram Blok**

#### a. Sistem Keseluruhan

```
[Pengguna] --> [Layar Sentuh] --> [Mikrokomputer]
                     |               |                |
                     v               v                v
              [Sistem Mekanisme Kunci]         [Basis Data]       [Sistem Vending]
                     |                                       |
                     v                                       v
          [Laci/Kotak Penyimpanan HP]           [Rak Barang & Mekanisme Pengeluaran]
```

#### b. Alur Proses

```
[Pengguna] --> [Layar Sentuh] --> [Sistem Penerimaan]
                                    |
                                    v
                              [Cetak Barcode]
                                    |
                                    v
                              [Simpan HP]
                                    |
                                    v
                              [Kunci Laci/Kotak]

[Pengguna] --> [Layar Sentuh] --> [Sistem Pengambilan]
                                    |
                                    v
                              [Pindai Barcode]
                                    |
                                    v
                              [Buka Laci/Kotak]
                                    |
                                    v
                              [Ambil HP]
                                    |
                                    v
                              [Tandai Laci/Kotak Kosong]

[Pengguna] --> [Layar Sentuh] --> [Sistem Vending]
                                    |
                                    v
                              [Pilih Barang]
                                    |
                                    v
                              [Pembayaran]
                                    |
                                    v
                            [Pengeluaran Barang]
```

### 4. **Desain Fisik**

- **Ukuran Lemari:** Disesuaikan dengan jumlah laci/kotak penyimpanan HP dan ruang untuk vending machine.
- **Laci/Kotak:** Cukup besar untuk menyimpan berbagai ukuran HP.
- **Rak Barang Vending:** Terorganisir dengan baik dan dapat menampung berbagai produk.
- **Posisi Layar Sentuh dan Scanner Barcode:** Dipasang di bagian depan lemari untuk memudahkan akses.

### 5. **Keamanan dan Pemeliharaan**

- **Keamanan:**
  - Hanya pengguna yang memiliki barcode yang bisa membuka laci/kotak.
  - Log aktivitas untuk melacak semua tindakan penyimpanan, pengambilan, dan pembelian.

- **Pemeliharaan:**
  - Pemeriksaan rutin terhadap sistem mekanisme kunci dan mekanisme pengeluaran barang.
  - Pembaruan perangkat lunak untuk meningkatkan fungsionalitas dan keamanan.

### 6. **Pengembangan Lebih Lanjut**

- **Integrasi dengan Aplikasi Mobile:** Menggunakan aplikasi mobile untuk mengelola penyimpanan, pengambilan HP, dan pembelian barang.
- **Pemberitahuan Otomatis:** Mengirim notifikasi ke pengguna ketika HP mereka disimpan, diambil, atau barang dibeli.
- **Monitoring Real-Time:** Memantau stok barang dan status laci/kotak secara real-time melalui internet.

Rancangan ini memberikan solusi yang multifungsi, menggabungkan penyimpanan HP dengan vending machine, yang dapat diimplementasikan di berbagai lokasi seperti sekolah, pusat perbelanjaan, atau tempat umum lainnya.


Posting Komentar

Lebih baru Lebih lama